Затем вычисляется вектор из заданной точки на поверхности трехмерного объекта до источника освещения. Оба аргумента должны быть определены в пространстве координат обзора (это значит, что приложение должно задать значения uniform-переменной LightPosition в пространстве координат обзора). Вычисление вектора направления освещения происходит так:
vec3 lightVec = normalizeCLightPosition - ecPosition):
6.2, Вершинный шейдер
Заранее определенные координаты объекта в пространстве обзора находятся б ecPosi ti on. Чтобы вычислить вектор направления освещения, нужно вычесть ко-ердинаты объекта из координат источника освещения. Результат вычислений также приводится к единичному вектору и сохраняется в переменной 1 ightVec.
Проведенные вычисления - подготовка к использованию встроенной функции reflect. Из преобразованной нормали поверхности и вычисленного вектора освещения можно получить вектор отражения от поверхности объекта; функция reflect требует вектор освещения (направление от источника освещения к поверхности), и так как мы вычислили направление от поверхности к источнику освещения, вектор 1 ightVec просто инвертируется:
vec3 reflectVec - reflectC-1ightVec. tnorm):
Так как оба вектора, используемые в этой операции, - единичные, то результирующий вектор также будет единичным. Чтобы завершить вычисление освещения, нужен еще один вектор - единичный вектор, определяющий направление обзора. Так как по определению точка обзора является началом координат (0,0,0) в пространстве координат обзора, нужно всего лишь инвертировать и привести к единичному вектору вычисленные координаты в пространстве обзора (ecPosition):
vec3 viewVec = normalize(-ecPosition);
С вычисленными векторами уже можно вычислять освещение конкретной вершины. Соотношения этих векторов показаны на рис. 6.2.
Рис, 6.2. Векторы для вычисления освещения в вершинном шейдере кирпичной стены
Рассеянное отражение создается следующим образом"opengl2_157.html">⇐ Предыдущая| |Следующая ⇒