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);
}