Я планирую создавать экземпляры геометрии в OpenGL ES 2.0. По сути, я планирую визуализировать одну и ту же геометрию (стул), возможно, 1000 раз в моей сцене.
Каков наилучший способ сделать это в OpenGL ES 2.0?
Я рассматриваю прохождение модели view mat4 как атрибут. Поскольку атрибуты относятся к данным на каждую вершину, мне нужно пропустить один и тот же mat4 три раза для каждой вершины одного и того же треугольника (поскольку представление модели остается постоянным по вершинам треугольника).
Это будет означать много дополнительных данных, отправляемых в графический процессор (2 дополнительных вершины * 16 чисел с плавающей запятой * (количество треугольников), количество дополнительных данных).
Или я должен отправлять mat4 только один раз на треугольник? Но как это возможно, используя атрибуты, поскольку атрибуты определены как данные "на вершину"?
Каков наилучший и эффективный способ создания экземпляров в OpenGL ES 2.0?
источник
glVertexAttribDivisor
:(Ответы:
ES2 не имеет ни glVertexAttribDivisor, ни текстур с плавающей точкой, так что ваши возможности весьма ограничены.
Определенно поместите модель своего стула в VBO, если вы еще этого не делаете. С этого момента вы более или менее ограничены отдельными вызовами в жеребьевке - по одному на каждого председателя - поэтому вопрос в том, чтобы максимально эффективно передать матрицу преобразования для каждого председателя в графический процессор.
Вы можете сделать это с помощью обычных вызовов glUniform, или вы можете использовать некоторые дополнительные слоты для атрибутов вершин и сделать некоторые вызовы glVertexAttrib (примечание: не glVertexAttribPointer) перед рисованием каждого стула, указав матрицу с использованием 4 таких слотов, и эти значения будут «придерживаться» для каждая последующая вершина в кресле. Это может быть достаточно быстрый путь на одном оборудовании, но медленнее на другом, так что вам придется экспериментировать.
Если ваши стулья не вращаются, вы можете просто отправить позицию своему шейдеру и создать новую матрицу преобразования на лету. Это звучит ужасно, но на самом деле это невероятно быстро (это просто установка 3 поплавков) и может сделать эту работу.
В целом, хотя и при условии, что вы стремитесь к типичной мобильной платформе, я думаю, что что бы вы ни делали, ничьи вызовут вас.
источник
Лучше всего использовать инстансинговый подход, очень похожий на скин-модели. Создайте VBO, в котором будет много копий вашего стула, все они идентичны. Теперь каждая вершина должна иметь байтовый атрибут, который будет содержать индекс матрицы преобразования, к которой он будет применен. Отправьте множество матриц в свой шейдер и используйте их в качестве трансформации мира каждого из ваших стульев. Таким образом, вы можете нарисовать в каждом вызове столько стульев, сколько максимальный размер параметра массива, без необходимости перезаписывать какие-либо данные в VBO.
источник
У Wolfire Games есть отличный пост в блоге о быстром создании объектов . Они выполняют рендеринг модели несколько раз, но отправляют разные матрицы для каждого объекта в единый слот.
Это довольно эффективный способ создания экземпляров целой группы объектов, потому что вам нужно всего лишь отправить данные один раз (самым большим узким местом при рендеринге пакета объектов всегда будет пропускная способность), а затем преобразовать модель в шейдер.
источник
http://www.youtube.com/watch?v=rfQ8rKGTVlg
Это Google Talk на WebGL, который является OpenGL ES для JavaScript, что означает, что в нем также нет экземпляров геометрии. Это может дать вам представление, хотя трудно сказать, потому что я не знаю, есть ли у вас узкое место на GPU или CPU.
Тем не менее, вы должны узнать об однородных переменных, абсолютно не нужно отправлять mat4 в атрибуте, все вершины вашего стула будут преобразованы одной и той же матрицей, вы должны отправлять его только один раз для каждой модели, а не для треугольника. Унифицированные переменные позволяют вам это делать, это особый вид переменных, которые вы можете установить в самой программе шейдера.
источник