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; в частности, он включает тайминги для различных аппаратных средств и технологий.