Листинг 9.24. Вычисление GL_REPLACE
color = texture2D(texO. gl TexCDord[0].xy):
В режиме GL_MODULATE входной цвет фрагмента умножается на значение, прочитанное из текстурной памяти. Этот режим применяется при вычислении освещения перед наложением текстуры (то есть вершинный шейдер вычисляет освещение, а фрагментный шейдер выполняет текстурирование). Белый цвет объекта здесь будет основным, а текстура задает рассеянный цвет (листинг 9.25).
1 Исторически сложилось так, что компоненты текстурных координат в OpenGL называются s, t, г и q. В языке шейдеров OpenGL они тоже называются одной буквой (это требование): s, t, р и <у. Буква г rte используется - она оставлена для обозначения цвета в наборе компонентов цвета г, g, Ь и а.
9,10. Итоги Листинг 9.25. Вычисление GL_MODULATE
color *= texture2D(texO. gl_TexCoord[0].xy):
Режим GL_DECAL используется для наложения непрозрачного изображения на часть объекта. Например, нужно наложить на гоночную машину ряд логотипов фирмы-спонсора или татуировки - на кожу персонажей игры. При доступе к RGBA-текстуре значение прозрачности каждого элемента текстуры применяется для линейной интерполяции между входными значениями RGB и такими же значениями текстуры. Значение прозрачности остается без изменений. Применение этого режима иллюстрируется листингом 9.26.
Листинг 9.26. Вычисление GL.DECAL
vec4 texture - texture2D(texO. gl_TexCoord[0].xy): vec3 col = m1x(color.rgp. texture.rgb, texture.a): color - vec4 [col. color.a):
Режим GLJ3LEND - единственный, который принимает во внимание цвет среды текущей текстуры. Значения RGB, прочитанные из текстуры, используются для линейной интерполяции между RGB-значениями входного фрагмента и цветом среды текстуры. Новое значение прозрачности вычисляется умножением предыдущего значения прозрачности входного фрагмента на значение прозрачности текстуры. Код шейдера, иллюстрирующий этот метод, приведен в листинге 9.27.
Листинг 9.27. Вычисление GL_BLEND
vec4 texture = texture2D(texO. gl_TexCoord[0].xy): vec3 col - mix(color.rgb. gl J"extureErwColor[0]. rgb. texture,rgb) ; color = vec4 (col. color.a * texture,a):