Короткий ответ:
Использование glMapBufferRange и обновлять только поддиапазон, который нуждается в модификации.
Длинный ответ:
Хитрость заключается в том, чтобы сопоставить уже существующий буфер с glMapBufferRange, а затем отображать только диапазон вам нужно. С учетом этих допущений:
- Вашей геометрия использует за вершину анимации морфинга
- количества вершин для моделей постоянно во время анимации.
Затем вы можете использовать glMapBufferRange обновлять только изменяющиеся части, и оставить остальные данные в одиночку. Полные загрузки с использованием glBufferData медленны, как черепаха, потому что они удаляют старый накопитель и выделяют новый. Это в дополнение к загрузке новых данных. glMapBufferRange позволяет вам читать/записывать существующие данные, он не выделяет и не освобождает.
Однако, если вы используете анимацию скелета, скорее передайте преобразования вершин как матрицы 4x4 на вершину вершинного шейдера и выполните там вычисления. Конечно, данные по вершинам, конечно, указаны с glVertexAttribPointer.
Кроме того, помните, что вы можете читать данные текстуры в вершинном шейдере и что OpenGL 3.1 представил некоторые новые призывы рисования экземпляра; glDrawArraysInstanced и glDrawElementsInstanced. Комбинированные могут использоваться для конкретных запросов. I. Вы можете делать вызовы с примерами с теми же данными геометрии, но отправлять позиции или любые данные, необходимые для вертекс, в виде текстур или массивов текстур. Это может избавить вас от смешивания и сопоставления наборов данных массива вершин.
Представьте, хотите ли вы отображать 100 экземпляров одной и той же модели, но с разными позициями или цветовой схемой. Или даже текстурные карты.
+1 для распознавания пакетной обработки как самой большой проблемы с графическим кодированием в эти дни. 1 draw call per Mhz кажется оптимистичным для меня после некоторого кодирования OpenGL ES iPhone - я нашел, что я ограничен 30-40 партиями, чтобы поддерживать приличную частоту кадров! – tsalter
Хорошо, я должен был добавить, что это правило может не применяться непосредственно к мобильным устройствам. Несколько лет назад я видел это на некоторых слайдах GDC, и он отлично меня обслуживал на ПК с ОС Windows. –
Btw, я только что нашел слайды здесь: http://ati.amd.com/developer/gdc/D3DTutorial3_Pipeline_Performance.pdf (в основном D3D9, OpenGL на странице 28) –