Краткий ответ:
Используйте glMapBufferRange и обновляйте только поддиапазон, который требует модификации.
Длинный ответ:
Хитрость заключается в том, чтобы сопоставить уже существующий буфер с glMapBufferRange , а затем отображать только необходимый диапазон. Учитывая эти предположения:
- Ваша геометрия использует морфинг анимации для каждой вершины
- Число вершин для моделей постоянно во время анимации.
Затем вы можете использовать glMapBufferRange , чтобы обновить только изменяющиеся части и оставить оставшиеся данные в покое. Полные загрузки с использованием glBufferData медленны как черепаха, потому что они удаляют старое хранилище памяти и выделяют новое. Это в дополнение к загрузке новых данных. glMapBufferRange позволяет только читать / записывать существующие данные, не выделяет и не освобождает.
Однако, если вы используете скелетную анимацию, передайте вершинные преобразования как матрицы 4x4 на каждую вершину вершинному шейдеру и выполните вычисления там. Данные для каждой вершины, конечно, указываются с помощью glVertexAttribPointer .
Также помните, что вы можете читать данные текстуры в вершинном шейдере, и что OpenGL 3.1 ввел несколько новых вызовов отрисовки экземпляра; glDrawArraysInstanced и glDrawElementsInstanced . Их можно использовать для поиска конкретных экземпляров. Т.е. вы можете выполнять вызовы отрисовки экземпляра с той же привязкой данных геометрии, но отправлять позиции или любые данные по каждой вершине, которые вам нужны, в качестве текстур или массивов текстур. Это может уберечь вас от смешивания и сопоставления различных наборов данных массива вершин.
Представьте, хотите ли вы визуализировать 100 экземпляров одной и той же модели, но с разными позициями или цветовыми схемами. Или даже карты текстур.