Осталось преобразовать координаты и сохранить результат gl_Position.
Листинг 13.6. Вершинный шейдер хлопушки с конфетти, использующий метод систем частиц
uniform float Time: // обновляется приложением с каждым кадром
uniform vec4 Background; // постоянный цвет фона
attribute vec3 Velocity: // начальная скорость attribute float StartTime: // время активации частицы
varying vec4 Color;
void main(void) {
vec4 vert:
float t = Time - StartTime:
if (t >= 0.0) {
vert = gl_Vertex + vec4 (Velocity * t. 0.0); vert.у -= 4.9 * t * t; Color = gl_Color:
}
else
{
vert - gl_Vertex: // начальное положение Color = Background; // цвет частицы до "рождения"
}
gl_Position = gl_ModelViewProjectionMatrix * vert:
}
3.6.3. Фрагментный шейдер хлопушки конфетти Фрагментный шейдер для создания изображений, приведенных на цветном рис. 24 (листинг 13.7), здесь описываться не будет, что даст читателю возможность поупражняться в понимании кода шейдеров.
Анимированные шейдеры
Листинг 13.7. Фрагментный шейдер хлопушки с конфетти, использующий метод систем частиц
varying vec4 Color;
void main (void) {
gl_FragColor = Color:
}
13.6.4. Улучшение тендеров Рассматриваемый шейдер можно сделать и более интересным. Передавая значение г из вершинного шейдера во фрагментный, можно менять цвет частицы с течением времени. Например, чтобы имитировать вспышку, цвет нужно изменить с желтого до красного и затем с красного до черного. При изменении значения прозрачности тоже получается интересный эффект - постепенное появление или исчезновение частицы.
Можно задавать время, за которое частица полностью исчезает, или расстояние от исходной точки до точки, в которой частица начинает исчезать. Также вместо рисования частиц в виде точек их можно рисовать короткими линиями. Это даст возможность применить к каждой частице эффект размытости. Размер точки или линии тоже может меняться с течением времени, и частицы будут расти или сжиматься. Модель можно сделать намного более сложной, чем описанная здесь. Чтобы частицы лучше выглядели, их можно рисовать как четырехугольники с текстурой, повернутые лицевой стороной к зрителю. (Существует расширение ARB для точечных спрайтов1, которое тоже можно применять.)