2013-04-17 2 views
2

Моя система состоит из нескольких объектов, представляющих квадраты. Каждый квадрат представлен одними и теми же вершинами, и поэтому каждый объект хранит только матрицы, которые представляют преобразование объекта через мир и его собственное пространство объектов. Во время каждого прохода рендеринга после того, как эти матрицы обновляются с их преобразованиями кадров, они умножаются на текущие матрицы представлений и проекций, чтобы сформировать матрицу MVP для этого объекта. Вершины объектов затем отправляются с матрицей MVP в шейдер, где вершины умножаются на матрицу MVP. Неэффективность здесь заключается в том, что каждый квадрат рисуется отдельно, то есть есть отдельный вызов glDrawElements для каждого квадранта. В любой момент может существовать 50 или 60 квадроциклов, некоторые из них выходят за рамки и уничтожаются или их анимация может завершиться, поэтому они также будут уничтожены, но больше будет случайным образом войти в существование. Будет ли значительный прирост производительности для хранения всех необходимых значений в VBO и просто вызова glDrawElements один раз в течение каждого прохода?Оптимизация с использованием VBO в OpenGL ES 2.0

ответ

1

Давайте об этом с некоторыми простыми математиками:

  • На данный момент вам не нужно нажать какие-либо данные вершин на GPU (каждый кадр), а 12-16 поплавков матрицы данных за квад , и выполнить умножение матричной матрицы на квадрат на ЦП.
  • При размещении всего в одном VBO вам необходимо перенести 4 вершины (~ 12 поплавков) на квадрат, но нет данных матрицы (за исключением глобального VP, конечно), и вам нужно выполнить 4 умножения матрицы-вектора (~ 1 матрица-матрица) на ЦП.

Таким образом, объем работы и передаваемых данных существенно не меняется. Но какие изменения заключаются в том, что перенесенные данные смещаются от многих небольших унифицированных обновлений к одному большому обновлению VBO, что, скорее всего, будет более быстрым (как из-за того, что обновление буфера, скорее всего, будет быстрее с аппаратной стороны, чем несколько однородных обновлений , но не прибивайте меня к этому, а во-вторых, из-за значительно сокращенных накладных расходов). И, кроме того, это еще более снижает накладные расходы, используя один большой призыв к призыву вместо многих меньших.

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

+0

Спасибо, христианин. Но при реализации этого я смотрю на другой запутанный аспект. Моя старая реализация также передала альфа-значение в качестве униформы для каждого квадрата. Хранение всех этих данных в одном VBO отлично работает, но мне нужно получить значение alpha в шейдере фрагментов. Единственный способ, которым я это знаю, - установить переменную в вершинном шейдере. Но если бы я это сделал, альфа-значение было бы интерполировано над каждым фрагментом. Верный? Совершенно не то, что я хочу. Какие-либо предложения? –

+0

@JoeyCarson Просто установите альфа-значение в качестве дополнительного атрибута per-vertex и передайте это через переменную в вершинном шейдере. Пока вы используете одно и то же значение для каждого угла одного квадроцикла, это значение будет одинаковым для каждого фрагмента этого квадранта (поскольку интерполяция между 1 и 1 может привести только к 1, а изменения только интерполируются внутри одиночных треугольников, а не через разные треугольники). И это дополнительное единственное значение per-vertex (а не только для каждого квадрата) тоже не повредит. –

+0

Ах, конечно! Пока эти значения равны, они не могут интерполировать. Я слишком много думал. Спасибо еще раз. –

1

Будет ли значительный прирост производительности для хранения всех необходимых значений в VBO и просто звонит glDrawElements один раз во время каждого прохода ?

Да, это было бы намного быстрее. Первая причина, как вы правильно определили, будет одним вызовом glDrawElements. И второе - факт, что VBO хранит данные в самом графическом процессоре.

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

Используя VBO, вы минимизируете взаимодействие с GPU и получаете максимальную выгоду. первая причина