11.1.1. Вершинный шейдер полосок Вершинный шейдер для эффекта полосок приведен в листинге 11.1. I Листинг 11.1. Вершинный шейдер для рисования полосок

uniform vec3 LightPosition: uniform vec3 LightColor: uniform vec3 EyePosition; uniform vec3 Specular: uniform vec3 Ambient: uniform float Kd;
varying vec3 DiffuseColor:

продолжение &

В дальнейшем фотореалистичными будим называть изображения, воспроизводящие окружающую действительность с максимально возможной точностью. Понятно, что в некоторых случаях это не требуется, например мри воспроизведении анимации. - Примеч. науч.ред.

Процедурные текстурные шейдеры

Листинг 11,1 (продолжение)

varying vec3 SpecularColor:
void maintvoid) {
vec3 ecPosition = vec3 (gl_ModelViewMatrix * gl_Vertex);
vec3 tnorm = normalize(gl_NormalMatrix * gl_Normal):
vec3 lightVec = normalizetLightPosition - ecPosition):
vec3 viewVec = normslize(EyePosition - ecPosition): vec3 tivec = normalize(viewVec + lightVec):
float spec = clampfdotchvec. tnorm). 0.0. 1.0);
spec = powCspec. 16,0):
DiffuseColor - LightColor * vec3 (Kd * dot(lightVec. tnorm)): DiffuseColor = clamp(Ambient + DiffuseColor. 0.0. 1.0): SpecularColor = clamp((LightColor * Specular * spec). 0.0. 1.0):
gl^TexCoord[0] = gl_MultiTexCoordO: gl_Positien = ftransfontK):
}

В этом шейдере есть несколько интересных особенностей, но действительно ничего необычного. Это хороший пример такого вычисления освещения, которое было бы совместимо со множеством фрагментных тендеров.

Как уже упоминалось, значения для вычисления освещения (LightPosition, LightColor, EyePosition, Specular, Ambiert и Kd) передаются приложением через uni-form-перемеппые. Назначение этого шейдера - вычислять Di ff LtseCol or и Specul ar-Col or, две varying-переменные, которые затем будут интерполированы для каждого примитива и переданы фрагментпому шейдеру для каждого фрагмента. Эти значения вычисляются обычным способом, с небольшой оптимизацией - Aflibi ent добавляется к вычисленному значению рассеянного отражения, чтобы посылать во фраг-ментный шейдер через varying-переменную на одно значение меньше. Входные текстурные координаты передаются во фрагментный шейдер как встроенная vary-т§-перемеипаяд1_ТехСоогс1[0],и координаты вершины преобразуются как обычно.


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