Что такое освещение DOT3?
Ответ на мой вопрос предполагает, что освещение DOT3 может помочь с рендерингом OpenGL ES, но у меня возникают проблемы с поиском подходящего определения того, что такое освещение DOT3.
Редактировать 1
Информация, связанная с iPhone, высоко ценится.
2 ответа
DOT3-освещение часто называют попиксельным освещением. При освещении вершин освещение рассчитывается для каждой вершины, а полученное освещение интерполируется по треугольнику. В освещении на пиксель, как следует из названия, цель состоит в том, чтобы рассчитать освещение на каждом пикселе.
То, как это делается на оборудовании с фиксированными функциями, как iPhone с так называемыми объединителями регистров. Название DOT3 происходит из этого состояния рендеринга:
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_DOT3_RGB);
Посмотрите на эту запись в блоге Вольфганга Энгельса для получения дополнительной информации о том, как именно это настроить.
При освещении каждого пикселя также популярно использовать так называемую карту нормалей. Это означает, что нормаль каждой точки на объекте хранится в специальной текстурной карте, карте нормалей. Это было популяризировано в игре DOOM 3 с помощью программного обеспечения ID, где использовались модели с довольно низким полигоном, но с картами нормалей высокого разрешения. Причиной использования этой техники является то, что глаз более чувствителен к изменению освещения, чем к изменению формы.
В вашем другом вопросе я видел, что причина этого состояла в том, что вы хотели уменьшить объем памяти данных вершин. Это верно, вместо того, чтобы хранить три компонента для нормали в каждой вершине, вам нужно только сохранить два компонента для координат текстуры на карте нормалей. Включение освещения на пиксель приведет к снижению производительности, поэтому я не уверен, что это будет чистый выигрыш, как обычно, советую попробовать и посмотреть.
Наконец, интенсивность рассеянного освещения в точке пропорциональна косинусу угла между нормалью поверхности и направлением света. Для двух векторов скалярное произведение определяется как:
a dot b = |a||b| cos(theta)
где |a|
а также |b|
длина векторов a
а также b
соответственно и theta
это угол между ними. Если длина равна единице, |a|
а также |b|
называются единичными векторами, а формула упрощается до:
a dot b = cos(theta)
это означает, что интенсивность рассеянного освещения определяется точечным произведением между нормалью поверхности и направлением света. Это означает, что все рассеянное освещение является формой освещения DOT3, даже если название относится к типу пикселей.
Bumpmapping - это наложение текстуры на модель, где яркость каждого текселя определяет высоту этого текселя.
Высота каждого текселя затем используется для возмущения освещения по всей поверхности.
Нормальное отображение - это наложение текстуры на модель, где цвет каждого текселя на самом деле равен трем значениям, которые определяют направление, в котором находится точка на поверхности.
Например, цвет (255, 0, 0) может означать, что поверхность в этом месте направлена вниз по положительной оси X.
Другими словами, каждый тексель является нормальным.
Название Dot3 происходит от того, что вы на самом деле делаете с этими нормалями.
Допустим, у вас есть вектор, который указывает в направлении, указанном источником света. И скажем, у вас есть вектор, который является нормалью к определенному текселю в вашей модели, который говорит вам, в каком направлении указывает этот тексель.
Если вы выполните простое математическое уравнение, называемое "точечным произведением" для этих двух нормальных векторов, например:
Точка = N1xN2x + N1y N2y + N1z * N2z
Тогда полученное значение представляет собой число, которое говорит вам, насколько эти два вектора указывают в одном направлении.
Если значение равно -1, то они указывают в противоположных направлениях, что фактически означает, что тексель указывает на источник света, а источник света указывает на тексель, поэтому тексель должен гореть.
Если значение равно 1, то они указывают в одном и том же направлении, что означает, что тексель направлен в сторону от источника света.
И если значение равно 0, то один из векторов указывает на 90 градусов относительно другого. То есть: если вы стоите на земле и смотрите вперед, то ваш вектор обзора составляет 90 градусов относительно нормали к земле, которая направлена вверх.