varying float Lightlntensity;

uniform float StartRad: uniform vec2 Freq; uniform vec2 Amplitude:

uniform sampler2D WobbleTex: void main (void)

{

vec2 perturb: float rad: vec3 color:

// Вычисление коэффициента возмущений для направления х

rad = (gl_TexCoord[0].s + gl_TexCoord[0].t - 1.0 + StartRad) * Freq.x:

// Приведение к диапазону -2.0*PI. 2*PI rad = rad * C_2PI_I: rad = fract(rad): rad = rad * C_2PI:

// -PI. PI

if (rad > C_PI) rad = rad - C_2PI; if (rad < -C_PI) rad = rad + C_2PI;

// -PI/2. PI/2

if (rad > C_PI_2) rad = C_PI - rad: if (rad < -C_PI_2) rad = -C_PI - rad;

perturb.x = (rad - (rad * rad * rad / 6.0)) * Amplitude.x;

// Вычисление коэффициента возмущений для направления у

rad = (gl_TexCoord[0].s - gl_TexCoord[0].t + StartRad) * Freq.у;

// Приведение к диапазону -2*PI. 2*PI rad = rad * C_2PI_I: rad = fract(rad): rad = rad * C_2PI:

// -PI. PI

if (rad > C_PI) rad = rad - C_2PI; if (rad < -C_PI) rad = rad + C_2PI:

// -PI/2. PI/2

if (rad > C_PI_2) rad = C_PI - rad: if (rad < -C_PI_2) rad = -C_PI - rad:

perturb.у = (rad - (rad * rad * rad / 6.0)) * Amplitude.y:

color = vec3 (texture2D(WobbleTex. perturb + gl_TexCoord[0].st)):

gl_FragColor = vec4 (color * Lightlntensity, 1.0):

}

13.8. Итоги

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

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

Анимация - мощный инструмент, способный донести до зрителя любую информацию, а язык шейдеров OpenGL предоставляет новый эффективный способ анимации объектов.

13.9. Ссылки

Для читателей, особо интересующихся анимационными эффектами, будет полезна книга [7]. Авторы книги обнаруживают глубокое понимание принципов работы с анимацией, происходящей на студии Диснея, в ней много цветных иллюстраций. Часть материалов этой книги была опубликована в докладе [3].

В книге [4] описано множество алгоритмов для компьютерной анимации. Книга [1] также содержит несколько разделов об анимации.

Системы частиц впервые были представлены Биллом Ривзом в докладе [5]. Джефф Ландер написал хорошее руководство по системам частиц [2]. Он также выложил несколько примеров исходного кода - демонстрационные программы создания систем частиц на языке шейдеров OpenGL.

1. DeLoura М. Game Programming Gems. Hingham, MS: Charles River Media, 2000.


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