1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
//
// Fragment shader for wobbling a texture
//
// Author: Antonio Tejada
//
// Copyright (c) 2002-2004 3Dlabs Inc. Ltd.
//
// See 3Dlabs-License.txt for license information
//
// Constants
const float C_PI = 3.1415;
const float C_2PI = 2.0 * C_PI;
const float C_2PI_I = 1.0 / (2.0 * C_PI);
const float C_PI_2 = C_PI / 2.0;
varying float LightIntensity;
uniform float mtime;
uniform float StartRad;
uniform vec2 Freq;
uniform vec2 Amplitude;
uniform sampler2D WobbleTex;
void main (void)
{
vec2 perturb;
float rad;
vec3 color;
// Compute a perturbation factor for the x-direction
rad = (gl_TexCoord[0].s + gl_TexCoord[0].t - 1.0 + StartRad) * Freq.x * mtime;
// Wrap to -2.0*PI, 2*PI
rad = rad * C_2PI_I;
rad = fract(rad);
rad = rad * C_2PI;
// Center in -PI, PI
if (rad > C_PI) rad = rad - C_2PI;
if (rad < -C_PI) rad = rad + C_2PI;
// Center in -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;
// Now compute a perturbation factor for the y-direction
rad = (gl_TexCoord[0].s - gl_TexCoord[0].t + StartRad) * Freq.y * mtime;
// Wrap to -2*PI, 2*PI
rad = rad * C_2PI_I;
rad = fract(rad);
rad = rad * C_2PI;
// Center in -PI, PI
if (rad > C_PI) rad = rad - C_2PI;
if (rad < -C_PI) rad = rad + C_2PI;
// Center in -PI/2, PI/2
if (rad > C_PI_2) rad = C_PI - rad;
if (rad < -C_PI_2) rad = -C_PI - rad;
perturb.y = (rad - (rad * rad * rad / 6.0)) * Amplitude.y;
color = vec3 (texture2D(WobbleTex, perturb + gl_TexCoord[0].st));
gl_FragColor = vec4 (color * LightIntensity, 1.0);
}
|