initial commit
[ld37_one_room] / sdr / shadow-notex.p.glsl
1 /* vi: set ft=glsl */
2 #ifdef USE_CUBEMAP
3 uniform samplerCube envmap;
4 #endif
5 uniform sampler2DShadow shadowmap;
6
7 varying vec3 vdir, ldir[3], normal;
8 varying vec4 shadow_tc;
9 varying vec3 wdir;
10
11 #define KD gl_FrontMaterial.diffuse.rgb
12 #define KS gl_FrontMaterial.specular.rgb
13 #define SPOW gl_FrontMaterial.shininess
14
15 #define LD(i) gl_LightSource[i].diffuse.rgb
16 #define LS(i) gl_LightSource[i].specular.rgb
17
18 vec3 calc_diffuse(in vec3 n, in vec3 l, in vec3 lcol)
19 {
20         float ndotl = max(dot(n, l), 0.0);
21         return KD * lcol * ndotl;
22 }
23
24 vec3 calc_specular(in vec3 n, in vec3 l, in vec3 v, in vec3 lcol)
25 {
26         vec3 h = normalize(l + v);
27         float ndoth = max(dot(n, h), 0.0);
28         return KS * lcol * pow(ndoth, SPOW);
29 }
30
31 void main()
32 {
33         float shadow = shadow2DProj(shadowmap, shadow_tc).x;
34
35         vec3 n = normalize(normal);
36         vec3 v = normalize(vdir);
37
38         vec3 l = normalize(ldir[0]);
39         vec3 diffuse = calc_diffuse(n, l, LD(0)) * shadow;
40         vec3 specular = calc_specular(n, l, v, LS(0)) * shadow;
41
42         l = normalize(ldir[1]);
43         diffuse += calc_diffuse(n, l, LD(1));
44         specular += calc_specular(n, l, v, LS(1));
45
46         l = normalize(ldir[2]);
47         diffuse += calc_diffuse(n, l, LD(2));
48         specular += calc_specular(n, l, v, LS(2));
49
50 #ifdef USE_CUBEMAP
51         // envmap
52         vec3 rdir = -reflect(wdir, n);
53         vec3 env_texel = textureCube(envmap, rdir).xyz;
54         specular += KS * env_texel;
55 #endif  // USE_CUBEMAP
56
57         vec3 ambient = gl_LightModel.ambient.rgb * KD;
58         gl_FragColor.rgb = ambient + diffuse + specular;
59         gl_FragColor.a = gl_FrontMaterial.diffuse.a;
60 }