Displacement (animated)
Hier kann ein Graustufen map benutzt werden um Oberflächen wie z.B. Wasser zu simulieren.
Screenshot:

Vertex Shader:
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 offset = average * DisplacementFactor - OffsetFactor; vec3 position = normalize(gl_Normal) * offset; 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 }
Fragment Shader:
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); }