2009-12-12 2 views
2

Ответ на вопрос my question предполагает, что освещение DOT3 может помочь с рендерингом OpenGL ES, но у меня возникли проблемы с поиском достойного определения того, что такое освещение DOT3.Что такое освещение DOT3?

Edit 1

iPhone информация, связанная с благодарностью.

ответ

8

DOT3-lighting часто упоминается как пиксельное освещение. При вершинном освещении освещение вычисляется в каждой вершине, и полученное освещение интерполируется по треугольнику. В пиксельном освещении, как следует из названия, объект должен рассчитать освещение на каждом пикселе.

Как это делается на аппаратных средствах с фиксированной функциональностью, так как iPhone имеет так называемые комбинированные регистры.Название DOT3 происходит из этого состояния рендеринга:

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_DOT3_RGB); 

Посмотрите на this записи в блоге на Wolfgang Энгельс блог для получения дополнительной информации о том, как точно установить это.

При использовании пиксельного освещения популярно также использовать так называемый normal map. Это означает, что нормаль каждой точки объекта хранится в специальной карте текстур, нормальной карте. Это было популяризировано в игре DOOM 3 по ID, где использовались довольно низкополигональные модели, где использовались, но с нормальными картами высокого разрешения. Причиной использования этого метода является то, что глаз более чувствителен к изменению освещения, чем изменение формы.

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

Наконец, интенсивность диффузного освещения в точке пропорциональна косинусу угла между нормальностью поверхности и направлением света. Для два вектора dot productэто определяется как:

a dot b = |a||b| cos(theta) 

, где |a| и |b| длина векторов a и b соответственно и theta угла между ними. Если длина равна одному, |a| и |b| упоминаются как единичные векторы и формула упрощается:

a dot b = cos(theta) 

это означает, что интенсивность диффузного освещения задается скалярное произведением между нормалью к поверхности и направление света. Это означает, что все диффузное освещение - это форма освещения DOT3, даже если имя относится к пикселю.

+0

Освещение DOT3 по-прежнему работает с изменяющейся точкой обзора? Нормали должны быть преобразованы с помощью матрицы обратного отображения модели (которая изменяется в соответствии с вашей точкой зрения). Благодаря текстурному освещению, использующему DOT3, нет никакого преобразования! – prideout

+0

@prideout Вместо преобразования нормалей вы преобразуете направление света в пространство нормальной карты. Это можно сделать либо на GPU (если у вас есть шейдеры), либо на CPU, если вы используете аппаратное обеспечение с фиксированной функциональностью. –

1

От here:

карты рельефа ставит текстуру на модели, где яркость каждого TEXEL определяет высоту этого тексела.

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

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

Например, цвет (255, 0, 0) может означать, что поверхность в этом месте указывает на положительную ось X.

Другими словами, каждый тексель является нормальным.

Название Dot3 происходит от того, что вы на самом деле делаете с этими нормалями.

Предположим, у вас есть вектор, который указывает в направлении ваших источников света. И предположим, что у вас есть вектор, который является нормальным в определенном текселе на вашей модели, который сообщает вам, в каком направлении тексель указывает.

Если вы простой математике уравнение называется "скалярное произведение" на этих двух нормальных векторов, например, так:

Dot = N1x N2X + N1Y N2y + N1z * N2z

Затем полученный value - это число, которое сообщает вам, сколько этих двух векторов указывает в одном направлении.

Если значение равно -1, то они указывают в противоположных направлениях, что на самом деле означает, что тексель указывает на источник света, а источник света указывает на тексель, поэтому тексель должен быть освещен.

Если значение равно 1, то они указывают в том же направлении, что означает, что тексель указывает от источника света.

И если значение равно 0, то один из векторов указывает на 90 градусов относительно другого. Т.е.: Если вы стоите на земле с нетерпением, то ваш вектор взгляда находится на 90 градусов относительно нормали земли, которая указывает вверх.

Смежные вопросы