Потом все эти вычисления повторяются для коэффициента возмущений в направлении у. Вычисления также линейно зависят от значений текстурных координат s и t, но проявляется зависимость немного иначе, что позволяет избежать симметрии в разных направлениях.
После вычисления коэффициентов возмущения можно обращаться к текстуре. Для получения окончательного цвета фрагмента значение цвета, полученное из текстурной карты, умножается на Lightlntensity. Несколько кадров из такой анимации приведены на цветном рис. 21. Эти кадры показывают, как шейдер работает с неподвижным логотипом. Этот эффект интересно применять также на поверхности воды, лавы, тины или даже шкуре животного или чудовища.
Листинг 13.8. Фрагментный шейдер для создания эффекта возмущений
// Константы
const float C_PI = 3.1415: const float C_2PI = 2.0 * C_PI; const float C_2PIJ = 1.0 / (2.0 * C_PI):
13.7. Колебания
const float C_PI_2 = C_PI /2.0:
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: