2011-12-28 3 views
9

Итак, я понимаю, как использовать объект буфера вершин, и что он обеспечивает значительное увеличение производительности по сравнению с графиком немедленного режима. Я буду рисовать много 2D-квадов (спрайтов), и я хочу знать, должен ли я создать VBO для каждого из них или создать один VBO для хранения всех данных?Сколько VBO я использую?

ответ

17

Вам не следует использовать новый VBO для каждого спрайта/квадроцикла. Поэтому положить их в один VBO было бы лучшим решением в вашем случае.

Но в целом я не думаю, что на это можно ответить в одном предложении.

Создание нового VBO для каждого Quad не даст вам реального увеличения производительности. Если вы это сделаете, много времени будет потрачено впустую с помощью glBindBuffer вызовов для переключения VBOs. Однако, если вы создаете VBOs, которые содержат слишком много данных, вы можете столкнуться с другими проблемами.

Малые О:

  • часто легче обращаться в вашем программном коде. Вы можете использовать новый VBO для каждого объекта, который вы визуализируете. Таким образом, вы можете легко управлять своими объектами в своем мире.
  • Если VBOs слишком малы (всего несколько треугольников), вы не получите большую пользу. Много времени будет потеряно при переключении буферов (и, возможно переключение шейдеры/текстуры) между буферами

Большие РВО:

  • Вы можете вынести тонны объектов с одним drawArrays() вызовом для лучшей производительности.
  • В зависимости от ваших данных возможно, что вы создаете накладные расходы для управления множеством объектов в одном VBO (что, если вы хотите переместить один из этих объектов и повернуть другой объект?).
  • Если ОБВ слишком велики ее возможно, что они не могут быть перемещены в VRAM

Следующие ссылки могут помочь вам:

Vertex Specification Best Practices

1

Используйте одно (или небольшое количество) VBO (ов), чтобы удерживать все/большую часть вашей геометрии.

Как правило, чем меньше вызовов API требуется для рендеринга вашей сцены, тем лучше.

1

Это также зависит от того, что d вы хотите делать с этими спрайтами?

Являются ли они динамическими? Вы хотите изменить только центр квада или, возможно, изменить все четыре точки?

Это важно, потому что если ваши данные являются динамическими, то самым простым способом вам придется переходить с процессора на gpu на каждый кадр. Может быть, вы могли бы выполнить все вычисления на графическом процессоре - например, используя геометрические шейдеры?

Также для очень простых квадрациклов/спрайтов можно использовать GL_POINT_SPRITE. С этим нужно отправить только одну вершину для целого квадранта. Но недостатком является то, что его трудно повернуть ...

Смежные вопросы