Листинг 15.4. Вершинный шейдер для матовой заливки Гуча

uniform vec3 LightPosition; // (0.0. 10.0, 4.0)
varying float NdotL; varying vec3 ReflectVec: varying vec3 ViewVec:
void main(void)
vec3 ecPos = vec3 (gl_ModelViewMatrix * gl_Vertex);
vec3 tnorm = normalize(gl_NormalMatrix * gl_Normal);
vec3 lightVec = normal izedightPosition - ecPos):
ReflectVec = normalize(reflect(-lightVec, tnorm)):
ViewVec = normalize(-ecPos); NdotL = (dotdightVec, tnorm) + 1.0) * 0.5: gl_Position = ftransform():

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

Фрагментный шейдер выполняет полутоновую заливку алгоритма Гуча и добавляет изображению компонент рассеянного отражения (листинг 15.5). Цвета и их пропорции заданы как uniform-переменные, и приложение может легко их менять. Единичные векторы отражения и обзора нормализуются во фрагментном шейдере, так как их длина после интерполяции может немного измениться. Результат рендеринга с помощью шейдера Гуча и алгоритма рисования силуэта Лен-дера показан на цветном рис. 23.

Листинг 15.5. Фрагментный шейдер для матовой заливки Гуча

uniform vec3 SurfaceColor: // (0.75, 0,75, 0,75)
uniform vec3 WarmColor; // (0,6, 0,6, 0,0)
uniform vec3 CoolColor; // (0,0, 0.0. 0,6)
uniform float DiffuseWarm; // 0,45
uniform float DiffuseCool; // 0,45
varying float NdotL:

продолжение

Нефотореалистичные шейдеры

Листинг 15.5 'продолжение)

varying vec3 ReflectVec: varying vec3 ViewVec:
void main (void) {
vec3 kcool = min(Cool Col or + OiffuseCool * SurfaceColor, 1.0)
vec3 kwarm = min(WarmColor + DiffuseWarm * SurfaceColor. 1.0)
vec3 kfinal = mix(kcool. kwarm, NdotL):
vec3 nreflect = normalize(ReflectVec): vec3 nview = normalize(ViewVec):
float spec = max(dot(nreflect. nview), 0.0): spec = pow(spec, 32.0);
gl_FragColor = vec4 (min(kfinal + spec, 1.0). 1.0);

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


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