В первой строке кода вершинного шейдера объявляется переменная ecPosition, в которую будут занесены вычисленные координаты вершины в пространстве обзора. Эти координаты вычисляются из значений glj/ertex, преобразованных с помощью текущей матрицы модели-вида gl _Mode1 Vi ewMatri x. Так как один из операндов - матрица, а второй - вектор, оператор * выполняет математическое, а не покомпонентное умножение.

Результат умножения матрицы на вектор будет типа vec4, однако ecPosition объявлена как vec3. Так как в языке шейдеров OpenGL нет автоматического преобразования типов, его приходится выполнять явно с использованием конструктора. При этом четвертый компонент вектора отбрасывается и типы операндов оператора присваивания будут совместимыми. (Конструкторы, помимо прочего, выполняют еще и некоторые преобразования типов; более подробно об этом говорилось в разделе 3.3.) При дальнейших вычислениях координаты вершины в пространстве обзора будут использоваться для вычисления освещения.

Вычислить освещение в этом примере совсем не сложно. Какая-то часть света из источника будет рассеиваться (то есть отражаться во всех направлениях). В направлениях, близких к направлению отражения от источника освещения, будет наблюдаться зеркальное отражение. Чтобы вычислить рассеивание света, нужно определить угол между поступающим лучом света и нормалью поверхности. Чтобы вычислить отражение света, нужно определить угол между направлением отражения и направлением обзора. Сначала преобразуем нормаль:

vec3 tnonn = normalize(gl_NormalMatrix * gl_Normal);

Эта строка объявляет новую переменную tnorm для сохранения значений преобразованной нормали (в OpenGL, как и в С++, можно объявлять переменные непосредственно перед использованием). Входные значения нормали (gl_Normal, встроенная переменная для доступа к значениям нормали) преобразуются с помощью матрицы преобразования нормали, определенной в OpenGL (gl_Normal Matri x). Вектор, полученный в результате преобразования, нормализуется, то есть приводится к вектору единичной длины, встроенной функцией normalize, и результат нормализации сохраняется в tnorm.


⇐ Предыдущая| |Следующая ⇒