Направление света и его преобразование в простейшей модели освещения - PullRequest
4 голосов
/ 05 сентября 2011

Итак, я получил базовое освещение в своем учебном квесте OpenGL.

Представьте себе эту простейшую модель освещения. Каждая вершина имеет позицию, цвет и нормаль. Шейдер получает матрицу ModelViewProjection ( MVP ), матрицу ModelView ( MV ) и нормальную матрицу ( N ), которая рассчитывается как (MV * 1010). * -1 ) T , а также LightColor и LightDirection в форме. Вершинный шейдер выполняет расчеты освещения - фрагментный шейдер просто выводит интерполированные цвета.

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

max(0, dot(LightDirection, N * normal))*LightColor*Color;

Я бы ожидал, что LightDirection должен быть сначала инвертирован, то есть правильная формула, я думаю, будет

max(0, dot(-LightDirection, N * normal))*LightColor*Color;

Похоже, предполагается, что LightDirection на самом деле является противоположностью вектора фактического светового потока.

Q1: Является ли это своего рода установленным соглашением о том, что LightDirection в этой модели считается вектором бесконечно далекого источника света, а не вектором направления света или это не принципиальное дело и просто так получилось, что в уроках, с которыми я сталкивался, это так предполагалось?

Q2: Если LightDirection находится в мировых координатах, а не в координатах глаза, его следует преобразовать с помощью нормальной матрицы или матрицы вида модели в координаты глаза?

Спасибо за разъяснение этих вещей!

Ответы [ 2 ]

2 голосов
/ 05 сентября 2011

Q1: Является ли это своего рода установленным соглашением о том, что направление LightDirection в этой модели считается вектором бесконечно далекого источника света, а не вектором направления света, или это не принципиальная вещь, и этопросто так получилось, что в уроках, с которыми я сталкивался, это так и предполагалось:

В фиксированной функции OpenGL при подаче положения источника света 4-й параметр определял, был ли источник света направленным или позиционным.В случае направленного света, поставляемый вектор указывает на (бесконечно далеко) источник света.

В случае позиционного источника света LightDirection вычисляется для каждой вершины как LightDirection = LightPosition - VertexPosition - радиsimplicity этот расчет выполняется в координатах глаза .

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

В фиксированной функции OpenGL положение источника света, передаваемое через glLighti, было преобразовано матрицей вида текущей модели во время вызова.Если свет был позиционным, он трансформировался обычной матрицей просмотра модели.В случае направленного света использовалась нормальная матрица.

1 голос
/ 05 сентября 2011

Является ли это своего рода установленным соглашением о том, что направление LightDirection в этой модели считается вектором бесконечно далекого источника света, а не вектором направления света, или это не принципиальная вещь, и так уж случилось, что в учебники, с которыми я сталкивался, так предполагалось?

Ни. Есть просто несколько видов огней.

Направленный свет представляет источник света, который с точки зрения сцены бесконечно далеко. Он представлен векторным направлением.

Позиционный источник света представляет собой источник света, имеющий положение в пространстве сцены. Он представлен векторной позицией.

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

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

Если LightDirection находится в мировых координатах, а не в координатах глаза, следует ли преобразовать его с помощью нормальной матрицы или матрицы вида модели в координаты глаза?

Ни. Если направление света находится в мировых координатах, то вам также необходимо получить нормаль к мировым координатам. Неважно, в каком пространстве вы освещаете (хотя делать это в клип-пространстве или других нелинейных постпроективных пространствах довольно сложно); важно то, что все находится в одном пространстве.

Матрица просмотра модели OpenGL по умолчанию делает то, что говорит: она переходит из пространства модели в представление пространство (пространство глаза). Он проходит через мировое пространство, но не останавливается на достигнутом. А стандартная матрица OpenGL по умолчанию - это просто обратное преобразование матрицы вида модели. Так что ни один из них не доставит вас в мир пространство.

В общем, вы не должны делать освещение (или что-либо еще на GPU) в мировом пространстве по причинам, лучше всего объясненным в другом месте . Чтобы сделать освещение в мировом пространстве, вам нужно иметь матрицы, которые трансформируются в мировое пространство. Мое предложение было бы сделать это правильно: поместите направление света в пространство глаза и оставьте мировое пространство для кода процессора.

...