ReflectVec = normalize(reflect(-lightVec, tnorm)):
ViewVec = normalize(-ecPos):
NdotL = (dotOightVec, tnorm) + 1.0) * 0.5:
gl Position = ftransformO ;
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(CoolColor + DiffuseCool * 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. Пример Мандельброта
Ни одна книга по программированию графики не обходится без примера рисования изображений Мандельброта. Последний шейдер этой главы не попадает в категорию художественного эффекта, но может служить примером выполнения общих вычислений на оборудовании для создания графики для изучения приемов визуализации. В данном случае оборудование для создания графики позволяет изучать известную математическую функцию, вычисляющую множество Мандельброта.
Этот шейдер включен в книгу как еще один пример возможностей языка шейдеров OpenGL: вычисления, ранее возможные только на основном процессоре, сегодня можно выполнять на графическом акселераторе, что дает большой выигрыш в производительности, так как могут обрабатываться несколько пикселов одновременно. Визуализация сложной математической функции, подобной множеству Мандельброта, - только верхушка айсберга в использовании программируемых шейдеров для визуализации математических формул и научных объектов.
15.3.1. О множестве Мандельброта
Чтобы понять, что такое множество Мандельброта, нужно вспомнить несколько понятий высшей математики. Существует число, называемое мнимым и обозначаемое г, определенное как результат квадратного корня из -1.