OpenGL VBO обновление данных - PullRequest
       12

OpenGL VBO обновление данных

15 голосов
/ 31 января 2011

Я должен нарисовать буфер, который содержит пару тысяч вершин. Я использую VBO для хранения данных.

Я знаю, что мне придется обновлять VBO много раз - но только небольшими частями за один раз.

Так что мне интересно, как лучше всего это сделать:

  1. Разделить VBO на более мелкие VBO (которые вмещают как 300 верт), а затем обновить отдельные VBO одним вызовом?
  2. Один большой VBO и использование лотов из glBufferSubData() звонков?
  3. Использовать glMapBuffer() и одно большое VBO?

Ответы [ 2 ]

10 голосов
/ 01 февраля 2011

Есть еще одна опция, которая немного похожа на опцию 3 - использовать одно большое VBO (возможно, в режиме GL_STREAM_DRAW), которое сбрасывает каждый кадр (вызывая glBufferData с указателем буфера NULL и таким же размером каждый раз) затем glMapBuffer -ed сразу. Буфер остается отображенным, как он заполнен, затем не отображен непосредственно перед рисованием. Повторите.

Вызов glBufferData сообщает OpenGL, что старое содержимое буфера не нужно, поэтому glMapBuffer потенциально не нужно ждать, чтобы убедиться, что GPU завершен с помощью GPU.

Похоже, что этот подход официально одобрен расширением vertex_buffer_object. См. Пример «Массивы вершин, использующие сопоставленный буферный объект»:

http://www.opengl.org/registry/specs/ARB/vertex_buffer_object.txt

Это говорит о том, что OpenGL (или драйвер?) Будет следить за такого рода поведением и (при обнаружении) упорядочивать вещи так, чтобы оно выполнялось эффективно.

2 голосов
/ 31 января 2011
  1. Звучит не очень хорошая идея: он заставляет вас рисовать его за несколько вызовов, одновременно меняя связанный буфер между каждым вызовом отрисовки.
  2. Может быть, если ваш буфер огромен.
  3. Весь буфер, безусловно, будет загружен в графический процессор. Это, безусловно, будет так же эффективно, как один glBufferData, но вы можете сделать это асинхронно.

Если вы считаете, что glBufferData или glMapBuffer - лучшее решение, если ваш буфер мал. 100000 * sizeof(float) * 3 ~= 1MB. С этим не должно быть проблем.

...