Displacement

Im Vertex-Shader werden die Vertices anhand eines Graustufenmaps entlang der Normalen verschoben.

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;

void main(void) {
  float average  = texture2D(tex1,gl_MultiTexCoord0.st).r;
  average       += texture2D(tex1,gl_MultiTexCoord0.st).g;
  average       += texture2D(tex1,gl_MultiTexCoord0.st).b;
  average       /= 3.0;
  
  vec3 offset    = average * DisplacementFactor - OffsetFactor;
  vec3 position  = normalize(gl_Normal) * offset;
  vec4 thisVert  = vec4(gl_Vertex.xyz+position,1.0);
  UVCoord 		   = gl_MultiTexCoord0.st;
  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;

void main(){
  gl_FragColor = vec4(vec3(texture2D(tex1,UVCoord))*LightIntensity, 1.0);
}