OpenGL. Обновление буфера вершин с помощью glBufferData
Я использую OpenGL
для реализации своего рода пакетного чертежа. Для этого я создаю vertex buffer
для хранения данных.
Примечание: этот буфер обычно обновляется на каждом кадре, но никогда не уменьшит размер (но все равно может увеличиться).
Мой вопрос: технически ли правильно использовать glBufferData
(с s treaming write-only mode
) для его обновления (вместо glMapBuffer
)? Я полагаю, что нет необходимости отображать его, так как полные данные обновляются, поэтому я просто отправляю полный пакет сразу. И если текущий размер буфера меньше, чем я отправляю, он автоматически увеличится, не так ли? Я просто уверен, что он действительно работает (возможно, он будет воссоздавать буфер для каждого вызова, нет?).
Ответы
Ответ 1
Лучше иметь буфер с фиксированным размером и не воссоздавать его в каждом кадре.
Вы можете достичь этого:
- создание буфера с максимальным размером, например, для 1000 вершин
- обновлять только начало буфера новыми данными. Поэтому, если вы изменили данные на 500 вершин, затем заполните первую половину буфера, используя glMapBuffer
- измените количество рисованных вершин при рисовании. Например, вы можете использовать только некоторый диапазон вершин (например, от 200 до 500) из всего 1000 вершинного буфера. Используйте glDrawArrays (режим, во-первых, счет)
идеи из комментариев:
- glMapBufferRange и glBufferSubData также могут помочь
- также рассмотрим двойную буферизацию буферов
ссылка: http://hacksoflife.blogspot.com/2010/02/double-buffering-vbos.html
надеюсь, что поможет
Ответ 2
В дополнение к тому, что сказал fen и datenwolf, см. Глава 22 OpenGL Insights; в частности, он включает тайминги для различных аппаратных средств и технологий.