Hier kann ein Graustufen map benutzt werden um Oberflächen wie z.B. Wasser zu simulieren.
vec3 Normal;
vec3 EyeDir;
vec4 EyePos;
varying float LightIntensity;
varying vec2 UVCoord;
uniform vec3 LightPosition;
uniform float DisplacementFactor;
uniform float OffsetFactor;
uniform sampler2D tex1;
uniform float Ani;
uniform float Iterations;
void main(void) {
UVCoord = gl_MultiTexCoord0.st;
int iteration = int(Iterations);
float average = 0;
for (int i = 1; i <= iteration; i++){
vec3 tex = vec3(texture2D(tex1,gl_MultiTexCoord0.st * float(i) + Ani));
average += (tex.r + tex.g + tex.b) / 3;
}
average /= float(iteration);
vec3 position = normalize(gl_Normal) * (average * DisplacementFactor - OffsetFactor);
vec4 thisVert = vec4(gl_Vertex.xyz+position,1.0);
gl_Position = gl_ModelViewProjectionMatrix * thisVert;
//light
Normal = normalize(gl_NormalMatrix * gl_Normal);
vec4 pos = gl_ModelViewMatrix * thisVert;
EyeDir = pos.xyz;
EyePos = gl_ModelViewProjectionMatrix * thisVert;
LightIntensity = max(dot(normalize(LightPosition - EyeDir), Normal), 0.0);
//end light
}
varying float LightIntensity;
varying vec2 UVCoord;
uniform sampler2D tex1;
uniform float Ani;
uniform float Iterations;
void main(){
vec3 Color = vec3(0);
int iteration = int(Iterations);
float average = 0;
for (int i = 1; i <= iteration; i++){
Color += vec3(texture2D(tex1,UVCoord * float(i) + Ani));
}
Color /= float(iteration);
gl_FragColor = vec4(Color * LightIntensity, 1.0);
}