light shader now takes into account map size in pixels
[dd2d.git] / data / shaders / srlight_blur.frag
blob32d7389cf4cccb4fd0bdb39eb1626a7ee85f52b0
1 #version 130
3 #define PI 3.1415926
5 uniform sampler2D tex0; // 1D distance
6 uniform sampler2D tex1; // background
7 uniform vec2 lightTexSize;
8 uniform vec2 mapPixSize;
9 #define SHADOW_DO_BLUR
12 #define SOFT_SHADOWS  (1.0f)
15 // sample from the 1D distance map
16 //float sample (in vec2 coord, in float r) { return step(r, texture2D(tex0, coord).r); }
17 #define sample(cc_)  step(r, texture2D(tex0, vec2(tc.x+(cc_)*blur, tc.y)).r)
20 void main (void) {
21   vec2 vTexCoord0 = gl_TexCoord[0].xy;
22   //vec2 btxy = gl_FragCoord.xy/(100.0*8.0);
23   vec2 btxy = gl_FragCoord.xy/mapPixSize;
24   float ltsxi = 1.0/lightTexSize.x;
26   // rectangular to polar
27   vec2 norm = vTexCoord0.st*2.0-1.0;
28   float theta = atan(norm.y, norm.x);
29   float r = length(norm);
30   float coord = (theta+PI)/(2.0*PI);
32   // the tex0 coord to sample our 1D lookup texture
33   // always 0.0 on y axis
34   vec2 tc = vec2(coord, 0.0);
36   // the center tex0 coord, which gives us hard shadows
37   float center = step(r, texture2D(tex0, tc.xy).r); //sample(vec2(tc.x, tc.y), r);
39   // now we use a simple gaussian blur
40   #ifdef SHADOW_DO_BLUR
41     // we multiply the blur amount by our distance from center
42     // this leads to more blurriness as the shadow "fades away"
43     float blur = ltsxi*smoothstep(0.0, 1.0, r);
45     /*
46     float sum = sample(vec2(tc.x-4.0*blur, tc.y), r)*0.05;
47     sum += sample(vec2(tc.x-3.0*blur, tc.y), r)*0.09;
48     sum += sample(vec2(tc.x-2.0*blur, tc.y), r)*0.12;
49     sum += sample(vec2(tc.x-1.0*blur, tc.y), r)*0.15;
50     sum += center*0.16;
51     sum += sample(vec2(tc.x+1.0*blur, tc.y), r)*0.15;
52     sum += sample(vec2(tc.x+2.0*blur, tc.y), r)*0.12;
53     sum += sample(vec2(tc.x+3.0*blur, tc.y), r)*0.09;
54     sum += sample(vec2(tc.x+4.0*blur, tc.y), r)*0.05;
55     */
56     float sum  = sample(-4.0)*0.05;
57           sum += sample(-3.0)*0.09;
58           sum += sample(-2.0)*0.12;
59           sum += sample(-1.0)*0.15;
60           sum += center*0.16;
61           sum += sample( 1.0)*0.15;
62           sum += sample( 2.0)*0.12;
63           sum += sample( 3.0)*0.09;
64           sum += sample( 4.0)*0.05;
66     // sum of 1.0 -> in light, 0.0 -> in shadow
67     float lit = mix(center, sum, SOFT_SHADOWS);
68   #else
69     //float sum = center;
70     float lit = center;
71   #endif
73   // multiply the summed amount by our distance, which gives us a radial falloff
74   // then multiply by vertex (light) color
76   //vec4 color = gl_Color*vec4(vec3(1.0), lit*smoothstep(1.0, 0.0, r));
77   lit = lit*smoothstep(1.0, 0.0, r);
78   vec4 bcolor = texture2D(tex1, btxy);
79   if (bcolor.a == 0.0) bcolor = vec4(0.0, 0.0, 0.0, 1.0);
80   vec4 color;
81   if (gl_Color.a == 0.0) {
82     color = bcolor*vec4(vec3(1.0), lit);
83   } else {
84     //lit /= 2;
85     //vec4 color = bcolor*vec4(vec3(1.0), lit);
86     //vec4 color = bcolor*vec4(vec3(1.0), lit);
87     //color += gl_Color*vec4(vec3(1.0), lit);
88     //
89     //color = bcolor;
90     //color *= gl_Color*vec4(vec3(1.0), lit);
91     //color += bcolor*vec4(vec3(1.0), lit);
92     //lit /= 2;
93     /*
94     vec4 ltv = vec4(vec3(1.0), lit);
95     color = gl_Color*ltv;
96     bcolor = bcolor*ltv;
97     bcolor.a = 1.0;
98     color.a = lit;
99     color = mix(color, bcolor, lit);
100     color.a = lit;
101     */
102     /*
103     color = gl_Color;
104     color.a = 1.0;
105     bcolor *= lit;
106     bcolor.a = 1.0;
107     color = mix(bcolor, color, lit);
108     */
109     color = gl_Color;
110     color += bcolor*lit;
111     color.a = lit;
112   }
113   gl_FragColor = color;
114   //float intens = (0.2125*color.x)+(0.7154*color.y)+(0.0721*color.z);
115   //gl_FragColor = vec4(intens, intens, intens, color.w);
116   //gl_FragColor = color;