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

Анимированные шейдеры

Листинг 13.2 (продолжение)

uniform vec3 LightPosition: uniform float SpecularContrtbution: uniform float DiffuseContribution:

uniform float Weight: // обновляется приложением для каждого кадра attribute vec4 VertexB; attribute vec3 NormalB:

void main(void) {
vec4 vert = mixCgl_Vertex. VertexB. Weight):
vec3 ecPosition = vec3 Cgl_ModelViewMatrix * vert):
vec3 tnorm = mix(gl_Normal. NormalB. Weight):
tnorm = normalize(gl_NormalMatrix * tnorm):
vec3 lightVec = normalizedightPosition - ecPosition);
vec3 reflectVec = reflect(-lightVec. tnorm);
vec3 viewVec = normalize(-ecPosition);
float spec = max(dot(reflectVec. viewVec). 0.0): spec = pow(spec, 16.0):
Lightlntensity = DiffuseContribution * max(dot(lightVec. tnorm). 0.0) + SpecularContribution * spec;
TexCoord = gl_MultiTexCoord0.st;
gl_Position = gl_ModelViewProjectionMatrix * vert:

13.5. Другие эффекты перехода Еще одним эффектом перехода является постепенное исчезновение объекта. В этом случае управляющее значение будет значением прозрачности объекта. Объект может быть нарисован полностью непрозрачным (значение прозрачности 1,0), полностью прозрачным (прозрачность 0) и полупрозрачным (значение прозрачности между 0 и 1,0).

Можно также скрыть части объекта директивой discard. Для этого в шейдере полосок, описанном в разделе 11.3, при перерисовке объекта отбрасывается определенное количество пикселов. Коэффициент отбрасывания пикселов может плавно меняться от 0 до 1,0 при появлении объекта и от 1,0 до 0 при его исчезновении. Вместо такого коэффициента можно использовать значение функции шума для каждой точки поверхности. Таким образом можно создать эффект разъедания или ржавления.

13.6. Системы частиц

В начале 80-х гг. Билл Ривз и его коллеги изобрели новый способ рендеринга примитивов. Традиционные методы рендеринга больше подходят для рисования ровных, четко определенных поверхностей. Ривз придумал способ рендеринга объек-


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