- uniform sampler2DShadow ShadowMap;
- uniform sampler2DShadow ShadowMapFar;
- uniform sampler2D NormalMap;
- varying vec4 ShadowCoord;
- varying vec4 ShadowCoord2;
- varying vec3 vertex_normal;
- varying vec3 vertex_light_position;
- uniform float xPixelOffset;
- uniform float yPixelOffset;
- float lookupNear(vec2 offSet)
- {
- return shadow2D(ShadowMap, vec3(ShadowCoord) + vec3(offSet.x * xPixelOffset * ShadowCoord.r, offSet.y * yPixelOffset * ShadowCoord.r, 0.0)).r;
- }
- float lookupFar(vec2 offSet)
- {
- return shadow2D(ShadowMapFar, vec3(ShadowCoord2) + vec3(offSet.x * xPixelOffset * ShadowCoord2.r, offSet.y * yPixelOffset * ShadowCoord2.r, 0.0)).r;
- }
- void main()
- {
- float shadow=0.0, x, y;
- vec2 o = mod(floor(gl_FragCoord.xy), 2.0);
- shadow = lookupNear(vec2(-1.5, 1.5) + o);
- shadow += lookupNear(vec2( 0.5, 1.5) + o);
- shadow += lookupNear(vec2(-1.5, -0.5) + o);
- shadow += lookupNear(vec2( 0.5, -0.5) + o);
- shadow = (shadow * 0.25) + 0.3;
- if (shadow >= 0.5) {
- shadow = lookupFar(vec2(-1.5, 1.5) + o);
- shadow += lookupFar(vec2( 0.5, 1.5) + o);
- shadow += lookupFar(vec2(-1.5, -0.5) + o);
- shadow += lookupFar(vec2( 0.5, -0.5) + o);
- shadow = (shadow * 0.25) + 0.3;
- }
- float diffuse_value = max(dot(vertex_normal, vertex_light_position), 0.0) + 0.3;
- vec4 texel = texture2DProj(NormalMap, gl_TexCoord[0]);
- if (diffuse_value < shadow)
- texel.rgb *= diffuse_value;
- else
- texel.rgb *= shadow;
- gl_FragColor = texel * gl_Color;
- }