MCposition = glj/ertex.xy :

Когда такой шаблон кирпичей уже наложен на геометрический объект, рисунок не должен сдвигаться по отношению к объекту, как бы ни менял свое расположение объект и как бы ни двигалась точка обзора. Чтобы совместить это требование с алгоритмическим вычислением рисунка поверхности во фрагментном шейдере, необходимо знать координаты каждого фрагмента, которые определяют его положение на поверхности объекта. В этом примере зададим модельные координаты каждой вершины, устанавливая varying-переменную MCposition в то же значение, что и исходные координаты вершины (которые по определению должны задаваться в пространстве координат объекта).

Во фрагментном шейдере не используются координаты z или да, так что нужен способ извлечь компоненты х и у из gl_Vertex. Мы могли бы использовать здесь конструктор (то есть написать vec2(gl_Vertex)), но, чтобы продемонстрировать еще одну возможность языка, выберем первые два компонента gl_Vertex (.ху) и затем сохраним их в переменной MCposition.

6.3. Фрагменты ый шейдер

Единственное, что нам осталось, - вычислить однородные координаты вершины (это должен выполнять каждый вершинный шейдер). Это достигается преобразованием входных координат вершины с помощью матрицы модели-вида-проекции с использованием встроенной функции ftransform: gl_Position = ftransformO;

}

Полный код созданного вершинного шейдера приведен в листинге 6.1.

Листинг 6.1. Исходный код шейдера кирпичной стены

uniform vec3 LightPosition:
const float SpecularContribution = 0.3: const float DiffuseContribution = 1.0 - SpecularContribution:
varying float Lightlntensity: varying vec2 MCposition:
void main(void) (
vecS ecPosition = vec3 (gl_ModelViewMatrix * gl_Vertex): vec3 tnorm = normalize(gl_NormalMatrix * glJJormal ) ; vec3 lightVec - normalize(LightPosition - ecPosition): vec3 reflectVec = reflect(-lightVec. tnorm): vac3 viewVec = normalize(-ecPosition); float diffuse - max(dot(lightVec, tnorm). 0.0): float spec = 0.0:
if (diffuse > 0.0)
{
spec - maxtdotCreflectVec. viewVec). 0.0): spec = powCspec. 16.0);

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