1 uniform sampler2DShadow shadowMap ;
3 // This define the value to move one pixel left or right
4 uniform vec2 pixelOffset = vec2(1.0 / 1024.0, 1.0 / 1024.0);
5 uniform sampler2D tex0;
8 varying vec4 ShadowCoord;
11 float lookup( vec2 offSet)
13 // Values are multiplied by ShadowCoord.w because shadow2DProj does a W division for us.
14 return shadow2DProj(shadowMap,
16 offSet.x * pixelOffset.x * ShadowCoord.w,
17 offSet.y * pixelOffset.y * ShadowCoord.w,
23 // Used to lower moiré pattern and self-shadowing
24 //shadowCoordinateWdivide.z += ;
28 // Avoid counter shadow
29 if (ShadowCoord.w > 1.0) {
30 // Simple lookup, no PCF
31 //shadow = lookup(vec2(0.0,0.0));
36 for (y = -3.5 ; y <=3.5 ; y+=1.0)
37 for (x = -3.5 ; x <=3.5 ; x+=1.0)
38 shadow += lookup(vec2(x,y));
42 // 8x8 PCF wide kernel (step is 10 instead of 1)
45 for (y = -30.5 ; y <=30.5 ; y+=10.0)
46 for (x = -30.5 ; x <=30.5 ; x+=10.0)
47 shadow += lookup(vec2(x,y));
54 for (y = -1.5 ; y <=1.5 ; y+=1.0)
55 for (x = -1.5 ; x <=1.5 ; x+=1.0)
56 shadow += lookup(vec2(x,y));
59 // 4x4 PCF wide kernel (step is 10 instead of 1)
62 for (y = -10.5 ; y <=10.5 ; y+=10.0)
63 for (x = -10.5 ; x <=10.5 ; x+=10.0)
64 shadow += lookup(vec2(x,y));
70 // use modulo to vary the sample pattern
71 vec2 o = mod(floor(gl_FragCoord.xy), 2.0);
73 shadow += lookup(vec2(-1.5, 1.5) + o);
74 shadow += lookup(vec2( 0.5, 1.5) + o);
75 shadow += lookup(vec2(-1.5, -0.5) + o);
76 shadow += lookup(vec2( 0.5, -0.5) + o);
80 vec4 c = (shadow + 0.0) * gl_Color;
81 gl_FragColor = mix(texture2D(tex0, texCoord), vec4(0.0,0.0,0.0,0.9), 0.8-shadow);