reprap: Added shadow mapping
[simavr] / examples / board_reprap / gfx / scene.fs
1 uniform sampler2DShadow shadowMap ;
2
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;
6 varying vec2 texCoord;
7
8 varying vec4 ShadowCoord;
9
10
11 float lookup( vec2 offSet)
12 {
13         // Values are multiplied by ShadowCoord.w because shadow2DProj does a W division for us.
14         return shadow2DProj(shadowMap, 
15                                 ShadowCoord + vec4(
16                                                 offSet.x * pixelOffset.x * ShadowCoord.w, 
17                                                 offSet.y * pixelOffset.y * ShadowCoord.w, 
18                                                 0.05, 0.0) ).w;
19 }
20
21 void main()
22 {       
23         // Used to lower moirĂ© pattern and self-shadowing
24         //shadowCoordinateWdivide.z += ;
25         
26         float shadow = 0.0;
27         
28         // Avoid counter shadow
29         if (ShadowCoord.w > 1.0) {
30                 // Simple lookup, no PCF
31                 //shadow = lookup(vec2(0.0,0.0));
32
33                 // 8x8 kernel PCF
34                 /*
35                 float x,y;
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));
39                 shadow /= 64.0 ;
40                 */
41
42                 // 8x8 PCF wide kernel (step is 10 instead of 1)
43                 /*
44                 float x,y;
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));
48                 shadow /= 64.0 ;
49                 */
50
51                 // 4x4 kernel PCF
52                 /*
53                 float 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));
57                 shadow /= 16.0 ;
58                 */
59                 // 4x4  PCF wide kernel (step is 10 instead of 1)
60                 
61                 float x,y;
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));
65                 shadow /= 16.0 ;
66                 
67                 
68                 // 4x4  PCF dithered
69                 /*
70                 // use modulo to vary the sample pattern
71                 vec2 o = mod(floor(gl_FragCoord.xy), 2.0);
72         
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);
77                 shadow *= 0.25 ;
78                 */
79         }
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);
82 }