Создание экземпляров геометрии в OpenGL ES 2.0

12

Я планирую создавать экземпляры геометрии в OpenGL ES 2.0. По сути, я планирую визуализировать одну и ту же геометрию (стул), возможно, 1000 раз в моей сцене.

Каков наилучший способ сделать это в OpenGL ES 2.0?

Я рассматриваю прохождение модели view mat4 как атрибут. Поскольку атрибуты относятся к данным на каждую вершину, мне нужно пропустить один и тот же mat4 три раза для каждой вершины одного и того же треугольника (поскольку представление модели остается постоянным по вершинам треугольника).

Это будет означать много дополнительных данных, отправляемых в графический процессор (2 дополнительных вершины * 16 чисел с плавающей запятой * (количество треугольников), количество дополнительных данных).

Или я должен отправлять mat4 только один раз на треугольник? Но как это возможно, используя атрибуты, поскольку атрибуты определены как данные "на вершину"?

Каков наилучший и эффективный способ создания экземпляров в OpenGL ES 2.0?

конек
источник
3
Я очень скучаю glVertexAttribDivisor:(
Уилл

Ответы:

9

ES2 не имеет ни glVertexAttribDivisor, ни текстур с плавающей точкой, так что ваши возможности весьма ограничены.

Определенно поместите модель своего стула в VBO, если вы еще этого не делаете. С этого момента вы более или менее ограничены отдельными вызовами в жеребьевке - по одному на каждого председателя - поэтому вопрос в том, чтобы максимально эффективно передать матрицу преобразования для каждого председателя в графический процессор.

Вы можете сделать это с помощью обычных вызовов glUniform, или вы можете использовать некоторые дополнительные слоты для атрибутов вершин и сделать некоторые вызовы glVertexAttrib (примечание: не glVertexAttribPointer) перед рисованием каждого стула, указав матрицу с использованием 4 таких слотов, и эти значения будут «придерживаться» для каждая последующая вершина в кресле. Это может быть достаточно быстрый путь на одном оборудовании, но медленнее на другом, так что вам придется экспериментировать.

Если ваши стулья не вращаются, вы можете просто отправить позицию своему шейдеру и создать новую матрицу преобразования на лету. Это звучит ужасно, но на самом деле это невероятно быстро (это просто установка 3 поплавков) и может сделать эту работу.

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

Максимус Минимус
источник
6

Лучше всего использовать инстансинговый подход, очень похожий на скин-модели. Создайте VBO, в котором будет много копий вашего стула, все они идентичны. Теперь каждая вершина должна иметь байтовый атрибут, который будет содержать индекс матрицы преобразования, к которой он будет применен. Отправьте множество матриц в свой шейдер и используйте их в качестве трансформации мира каждого из ваших стульев. Таким образом, вы можете нарисовать в каждом вызове столько стульев, сколько максимальный размер параметра массива, без необходимости перезаписывать какие-либо данные в VBO.

r2d2rigo
источник
3

У Wolfire Games есть отличный пост в блоге о быстром создании объектов . Они выполняют рендеринг модели несколько раз, но отправляют разные матрицы для каждого объекта в единый слот.

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

knight666
источник
+1 Во всяком случае, я все еще не уверен, что ссылка на текст Nvidia также применима к мобильным чипам PVR. Особенно об их упоминании о водительской части. http.download.nvidia.com/developer/SDK/Individual_Samples/DEMOS/…
Eonil
1

http://www.youtube.com/watch?v=rfQ8rKGTVlg

Это Google Talk на WebGL, который является OpenGL ES для JavaScript, что означает, что в нем также нет экземпляров геометрии. Это может дать вам представление, хотя трудно сказать, потому что я не знаю, есть ли у вас узкое место на GPU или CPU.

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

Dreta
источник