Итак, я получил базовое освещение в своем учебном квесте 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 находится в мировых координатах, а не в координатах глаза, его следует преобразовать с помощью нормальной матрицы или матрицы вида модели в координаты глаза?
Спасибо за разъяснение этих вещей!