Листинг 13.2 (продолжение)
uniform vec3 LightPosition; uniform float SpecularContri.bution; uniform float DiffuseContribution;
uniform float Weight; // обновляется приложением для каждого кадра attribute vec4 VertexB; attribute vec3 Normal В:
void mainCvoid)
{
vec4 vert = mix(gl_Vertex, VertexB, Weight): vec3 ecPosition = vec3 (gl_ModelViewMatrix * vert); vec3 tnorm = mix(gl_Normal. NormalB. Weight);
tnorm = normalize(gl_NormalHatrix * tnorm);
vec3 lightVec = normalize(LightPosition - ecPosition);
vec3 reflectVec = reflectOlightVec. 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_ModelViewProjectionHatrix * vert;
}
13.5. Другие эффекты перехода
Еще одним эффектом перехода является постепенное исчезновение объекта. В этом случае управляющее значение будет значением прозрачности объекта. Объект может быть нарисован полностью непрозрачным (значение прозрачности 1,0), полностью прозрачным (прозрачность 0) и полупрозрачным (значение прозрачности между 0 и 1,0).
Можно также скрыть части объекта директивой di scard. Для этого в шейдере полосок, описанном в разделе 11.3, при перерисовке объекта отбрасывается определенное количество пикселов. Коэффициент отбрасывания пикселов может плавно меняться от 0 до 1,0 при появлении объекта и от 1,0 до 0 при его исчезновении. Вместо такого коэффициента можно использовать значение функции шума для каждой точки поверхности. Таким образом можно создать эффект разъедания или ржавления.
13.6. Системы частиц
В начале 80-х гг. Билл Ривз и его коллеги изобрели новый способ рендеринга примитивов. Традиционные методы рендеринга больше подходят для рисования ровных, четко определенных поверхностей. Ривз придумал способ рендеринга объек тов, называемых нечеткими - огня, дыма, распыленной жидкости, хвостов комет, фейерверков и других природных явлений. Эти явления нечеткие, так как не имеют определенных границ, а вид объектов меняется с течением времени.
Способ, которым Ривз решил проблему, описан в статье [5]. Системы частиц и раньше использовались при рендеринге, но по-другому. Ривз стал задавать каждой частице набор начальных условий и устанавливать набор вероятностных правил поведения частиц с течением времени.
Существует три основных отличия метода создания системы частиц от традиционного метода рисования поверхности объекта.
1. Объект представлен скоплением частиц, определяющих объем, а не многоугольников или кривых, определяющих поверхность.