Открытые iPhone: концептуальные знания - PullRequest
0 голосов
/ 02 марта 2012

Привет, ребята. У меня есть концептуальный вопрос о функции рендеринга opengles на iPhone.Скажи, у меня есть куб.Куб имеет 6 граней и, следовательно, 12 треугольников.Если я вычислю нормаль для каждого треугольника, у меня будет 12 нормалей, у каждой нормали x, y, z кординатыСледовательно, у меня есть массив из 36 поплавков.В моей функции рендеринга я хочу передать координаты x, y, z в вершину для некоторых вычислений, связанных с освещением.Это мой призыв к достижению этого

  glVertexAttribPointer(_simpleLightNormalAttribute, 3, GL_FLOAT, GL_FALSE, sizeof(float), duplicateNormals); 

Индексы 0,1,2 содержат x, y, z кординаты первого треугольника и так далее.Откуда opengl знает, что индексы 2,3,4 содержат x, y, z кординаты 2 треугольника?

Любая помощь будет высоко ценится /

Ответы [ 2 ]

1 голос
/ 02 марта 2012

OpenGL не определяет вершину так, как вы. В классическом OpenGL с фиксированным конвейером единственная вершина - это местоположение и / или нормаль, и / или цвет, и / или координата текстуры.

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

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

Дополнительно:

В ES 2 в основном применяется то же правило: все свойства относятся к вершине и интерполируются по таким граням, которые вы укажете. Таким образом, вы все еще не в состоянии указать свойства для лица. Исключением является то, что вы можете менять форму по желанию, поэтому в вашем случае вы можете использовать униформу для нормали, хотя в итоге вы будете рисовать два треугольника, менять форму, рисовать еще два треугольника, снова менять форму и т. Д. , что было бы невероятно неэффективным способом.

Так что вам, вероятно, все еще понадобятся 24 вершины - по одной на каждое место на грани.

0 голосов
/ 02 марта 2012

Если вы передаете вершины каждого треугольника отдельно (как это делает проект OpenGL Game и как вы, похоже, делаете), а не используете индексы, то вам необходимо указать нормаль для каждой вершины. Для куба с четко определенными ребрами вы, вероятно, захотите отправить одну и ту же перпендикулярную нормаль для каждой вершины грани.

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

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...