Итак, я добрался до основ освещения в моем учебном поиске OpenGL.
Представьте себе эту простейшую модель освещения. Каждая вершина имеет положение, цвет и нормаль. Шейдер получает матрицу ModelViewProjection (MVP), матрицу Modelview(MV) , и матрица нормалей (N), которая вычисляется как (MV-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 находится в мировых координатах, а не в координатах глаза, следует ли преобразовывать его с помощью нормальной матрицы или матрицы modelview в координаты глаза?
Спасибо за разъяснение этих вещей!