OpenGL. Обновление буфера вершин с помощью glBufferData

Я использую OpenGL реализовать какой-то пакетный рисунок. Для этого я создаю vertex buffer хранить данные.

Примечание: этот буфер обычно обновляется в каждом кадре, но никогда не уменьшает размер (но все же может увеличиваться).

Мой вопрос: это технически правильно использовать glBufferDatatreaming write-only mode) для его обновления (вместо, например, glMapBuffer)? Я предполагаю, что нет необходимости отображать его, так как полные данные обновляются, поэтому я просто отправляю полный пакет сразу. И если текущий размер буфера меньше, чем я посылаю, он автоматически увеличится, не так ли? Я только сейчас уверен в том, как это действительно работает (возможно, он будет воссоздавать буфер при каждом вызове, нет?).

2 ответа

Решение

Было бы лучше иметь буфер с фиксированным размером и не воссоздавать его каждый кадр.

Вы можете достичь этого путем:

  • создание буфера с максимальным размером, например, пространство для 1000 вершин
  • обновить только начало буфера новыми данными. Так что если вы изменили данные на 500 верт, то заполните только первую половину буфера, используя glMapBuffer
  • изменить количество нарисованных вершин при рисовании. Например, вы можете использовать только некоторый диапазон вершин (например, от 200 до 500) из всего буфера 1000 вершин. Используйте glDrawArrays (mode, first, count)

идеи из комментариев:

  • glMapBufferRange и glBufferSubData также могут помочь
  • также рассмотрим двойную буферизацию буферов

ссылка: http://hacksoflife.blogspot.com/2010/02/double-buffering-vbos.html

надеюсь, это поможет

В дополнение к тому, что сказали Фэн и Дейенволф, см. Главу 22 OpenGL Insights; в частности, он включает в себя время для различных аппаратных средств и методов.

Другие вопросы по тегам