Затем вычисляется вектор из заданной точки на поверхности трехмерного объекта до источника освещения. Оба аргумента должны быть определены в пространстве координат обзора (это значит, что приложение должно задать значения 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">⇐ Предыдущая| |Следующая ⇒