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. Улучшение шейдеров

Рассматриваемый шейдер можно сделать и более интересным. Передавая значение t из вершинного шейдера во фрагментный, можно менять цвет частицы с течением времени. Например, чтобы имитировать вспышку, цвет нужно изменить с желтого до красного и затем с красного до черного. При изменении значения прозрачности тоже получается интересный эффект - постепенное появление или исчезновение частицы.

Можно задавать время, за которое частица полностью исчезает, или расстояние от исходной точки до точки, в которой частица начинает исчезать. Также вместо рисования частиц в виде точек их можно рисовать короткими линиями. Это даст возможность применить к каждой частице эффект размытости. Размер точки или линии тоже может меняться с течением времени, и частицы будут расти или сжиматься. Модель можно сделать намного более сложной, чем описанная здесь. Чтобы частицы лучше выглядели, их можно рисовать как четырехугольники с текстурой, повернутые лицевой стороной к зрителю. (Существует расширение ARB для точечных спрайтов1, которое тоже можно применять.)

Настоящая прелесть работы с системами частиц из шейдера заключается в том, что вычисления выполняются в основном на графическом акселераторе, а не на основном процессоре. Если данные для создания системы частиц хранятся в буферном объекте, скорее всего, они будут храниться в памяти графического ускорителя, и для рендеринга даже не будет использоваться шина передачи данных. Однако уравнение для обновления каждой частицы, написанное на языке шейдеров OpenGL, может оказаться довольно сложным. Так как рендеринг системы частиц выполняется так же, как рендеринг любого другого трехмерного объекта, то во время анимации можно поворачивать каждую частицу как угодно. Используя метод систем частиц, можно применять любое количество эффектов.

13.7. Колебания

В двух предыдущих примерах анимация объекта выполнялась в основном вершинным процессором (так как форма объекта не может изменяться фрагментным процессором). Но фрагментный процессор также можно использовать для создания эффектов анимации. Основное назначение большинства фрагментных шейдеров - вычислять цвет фрагмента, и любые коэффициенты, влияющие на цвет, могут зависеть от времени. В этом разделе будет представлен шейдер, который вносит зависящие от времени возмущения в текстурные координаты, создающие эффект колебаний или возмущений. Если выбрана правильная текстура, с помощью этого эффекта можно создавать «желатиновую» поверхность или «танцующий» логотип.


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