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.


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