Листинг 9.23. Вычисление произвольного отсечения

g1_ClipVertex = gl_ModelViewMatnx * glj/ertex:

9.9. Наложение текстуры

Чтение значений из текстурной памяти выполняется с помощью встроенных текстурных функций. Эти значения нужны для разных целей. Стандартная функциональность OpenGL включает поддержку формул для наложения текстур, определяемых символическими константами GL_REPLACE, GL_MODULATE, GL DECAL, GL_BLEND и GL_ADD. Эти режимы работают по отдельности, в зависимости от формата текстуры, к которой обращаются. Следующий код - иллюстрация случая обращения к текстуре RGB А с помощью семплера texO. Переменная col or инициализирована в gl_Со1 ог и изменена таким образом, что содержит значение цвета после наложения текстуры. GL_REPLACE - самый простой режим наложения текстуры. При этом происходит простая замена цвета текущего фрагмента цветом из текстуры (листинг 9.24).

Листинг 9.24. Вычисление GL^REPLACE

color = texture2D(texO, glJTexCoord[0].xy); В режиме GL_MODULATE входной цвет фрагмента умножается на значение, прочитанное из текстурной памяти. Этот режим применяется при вычислении освещения перед наложением текстуры (то есть вершинный шейдер вычисляет освещение, а фрагментный шейдер выполняет текстурирование). Белый цвет объекта здесь будет основным, а текстура задает рассеянный цвет (листинг 9.25).

Листинг 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 = mix(color.rgb. texture.rgb, texture.a): color - vec4 [col. color.a): Режим GL_BLEND - единственный, который принимает во внимание цвет среды текущей текстуры. Значения RGB, прочитанные из текстуры, используются для линейной интерполяции между RGB-значениями входного фрагмента и цветом среды текстуры. Новое значение прозрачности вычисляется умножением предыдущего значения прозрачности входного фрагмента на значение прозрачности текстуры. Код шейдера, иллюстрирующий этот метод, приведен в листинге 9.27.

Листинг 9.27. Вычисление GL_BLEND

vec4 texture = texture2D(texO. gl_TexCoord[0].xy): vec3 col = mix(color.rgb. glJTextureEnvColorCOJ.rgb, texture,rgb); color = vec4 (col. color.a * texture.a); В режиме GL_ADD вычисляется сумма цвета входящего фрагмента и значения, прочитанного из текстуры. Значения прозрачности перемножаются. Это единственный традиционный режим, в котором вычисленные значения могут выходить за пределы диапазона [0,1], так что результат нужно привести к этому диапазону (листинг 9.28).


⇐ вернуться назад | | далее ⇒