Нормальные карты и нормальные координаты

В настоящее время я работаю с OpenGL ES 1.1 и использую соглашение DrawElements вместе с массивами вершин, нормалей, координат текстуры и индекса.

Недавно я столкнулся с этим, исследуя идею использования отображения Normal / Bump, которое ранее было невозможно с OpenGL ES: http://iphone-3d-programming.labs.oreilly.com/ch08.html

Я могу сгенерировать карту нормалей для объекта уже из моего 3D-моделлера, но я не совсем понимаю, будет ли нужен массив нормальных координат больше при реализации 2-го текстурного блока для нормального отображения, или будет Освещение + Цветовая текстура в сочетании с картой нормалей с помощью опции DOT3_RGB - это все, что требуется?

РЕДАКТИРОВАТЬ - После дальнейшего исследования освещения DOT3 я не уверен, что ответ, данный Огнианом, правильный. На этой странице http://www.3dkingdoms.com/tutorial.htm приведен пример это использование, и если вы посмотрите на бит кода раздела «Рендеринг и окончательный результат», там нет нормального массива. ClientState для обычных массивов никогда не включается.

Я также нашел здесь этот пост, Что такое освещение DOT3?, который хорошо это объясняет ... но подводит меня к другому вопросу. В комментариях сказано, что вместо перевода нормалей вы переводите направление света. Меня это смущает, как будто у меня есть игра со стационарной стеной ... зачем мне перемещать свет только для одной модели? Надеясь, что кто-то сможет дать хорошее объяснение всему этому ...


person Maximus    schedule 10.07.2010    source источник


Ответы (1)


В то время как карты нормалей касательного пространства возмущают нормали, которые интерполируются из нормалей для каждой вершины, карты нормалей объектного пространства уже содержат всю необходимую информацию об ориентации поверхности на карте. Следовательно, если вы просто выполняете освещение DOT3 в OpenGL ES 1.1, вам не нужно снова передавать нормали.

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

person Pivot    schedule 10.07.2010
comment
По вектору света мы просто говорим о массиве light0position в glLightfv (GL_LIGHT0, GL_POSITION, light0position)? Если я вручную трансформирую его, чтобы исправить освещение на одном объекте ... разве я не полностью испортил то, как свет попадает на все остальное? Как преобразовать его, а затем применить только к изменению цвета только рассматриваемого объекта? Спасибо за твердый ответ, Pivot, кстати. - person Maximus; 11.07.2010
comment
Если вы выполняете сопоставление нормалей между объектами и пространством, как в разделе «Сопоставление нормалей с OpenGL ES 1.1» первой опубликованной ссылки, вы вообще не используете обычное освещение OpenGL ES 1.1. На этом этапе вы хотите передать свой вектор света (в пространстве объектов) в качестве цвета вершины, чтобы вы могли использовать его для DOT3. Часто можно получить достаточно приличное приближение, используя один и тот же цвет для всех вершин (вектор света в пространстве объекта в центр вашего объекта). - person Pivot; 11.07.2010
comment
Ладно, все становится более понятным ... едва ли. Все, что спровоцировало это, заключалось в том, что я использовал обычное освещение и считал, что отображение нормалей невозможно с OpenGL ES. Когда я узнал, что это возможно, я пытался понять, как это работает. Итак ... прежде чем я продолжу ... это хорошая идея? Возможно ли это быстрее, чем обычное освещение OpenGL ES 1.1? - person Maximus; 11.07.2010
comment
Будет ли освещение DOT3 быстрее или нет, вероятно, зависит от того, на каком оборудовании вы работаете, но то, что он действительно делает, это снижает нагрузку на сторону обработки вершин в обмен на немного больше работы по обработке фрагментов. Это, безусловно, может выглядеть намного лучше, чем освещение для каждой вершины, если ваша модель изначально была построена с большим количеством деталей, чем может быть представлено с вашим бюджетом многоугольника, при условии, что вы можете справиться с ограничениями (например, только рассеянное освещение). - person Pivot; 11.07.2010
comment
Спасибо за вашу помощь, Пивот. Вы случайно не знаете какой-нибудь полный пример, в котором используются 2 текстуры (цвет и карта нормалей)? Я очень близок к тому, чтобы наконец понять это, но мне все еще что-то не хватает ... Я понимаю, что вам нужно использовать основной glColor и вектор света, чтобы определить, как освещение в этой точке, но затем как это используется для смешивания с цветом из палитры и карты нормалей ... вот где я его теряю. - person Maximus; 12.07.2010
comment
Попробуйте diaryofagraphicsprogrammer.blogspot.com/2008/12/. Цвет вершины - это направление света в пространстве объекта, перенесенное из диапазона [-1, 1] в [0, 1]. Блок текстуры 0 делает выборку из вашей карты нормалей и вычисляет попиксельное диффузное освещение (N⋅L). Блок текстуры 1 делает выборку из вашей цветовой карты и модулирует ее интенсивностью рассеянного света, рассчитанной блоком текстуры 0. - person Pivot; 13.07.2010