ubershaders and path stripping in metascene
[ld37_one_room] / sdr / uber.p.glsl
diff --git a/sdr/uber.p.glsl b/sdr/uber.p.glsl
new file mode 100644 (file)
index 0000000..ee5c0f1
--- /dev/null
@@ -0,0 +1,100 @@
+/* vi:set ft=glsl: */
+#ifdef USE_TEXMAP
+uniform sampler2D texmap;
+#endif
+#ifdef USE_CUBEMAP
+uniform samplerCube envmap;
+#endif
+#ifdef USE_SHADOWMAP
+uniform sampler2DShadow shadowmap;
+#endif
+
+varying vec3 vpos, vdir, normal;
+#ifdef USE_SHADOWMAP
+varying vec4 shadow_tc;
+#endif
+#ifdef USE_CUBEMAP
+varying vec3 wdir;
+#endif
+
+#ifdef USE_TEXMAP
+#define KD texel.rgb
+#else
+#define KD gl_FrontMaterial.diffuse.rgb
+#endif
+
+#define KS gl_FrontMaterial.specular.rgb
+#define SPOW gl_FrontMaterial.shininess
+
+#define LD(i) gl_LightSource[i].diffuse.rgb
+#define LS(i) gl_LightSource[i].specular.rgb
+#define LPOS(i) gl_LightSource[i].position.xyz
+
+vec3 calc_diffuse(in vec3 n, in vec3 l, in vec3 color, in vec3 lcol)
+{
+       float ndotl = max(dot(n, l), 0.0);
+       return color * lcol * ndotl;
+}
+
+vec3 calc_specular(in vec3 n, in vec3 l, in vec3 v, in vec3 color, in vec3 lcol)
+{
+       vec3 h = normalize(l + v);
+       float ndoth = max(dot(n, h), 0.0);
+       return color * lcol * pow(ndoth, SPOW);
+}
+
+
+void main()
+{
+#ifdef USE_TEXMAP
+       vec4 texel = texture2D(texmap, gl_TexCoord[0].st);
+#endif
+#ifdef USE_SHADOWMAP
+       float shadow = shadow2DProj(shadowmap, shadow_tc).x;
+#else
+       const float shadow = 1.0;
+#endif
+
+       vec3 n = normalize(normal);
+       vec3 v = normalize(vdir);
+
+       vec3 diffuse = vec3(0.0, 0.0, 0.0);
+       vec3 specular = vec3(0.0, 0.0, 0.0);
+
+#ifdef USE_LIGHT0
+       {
+               vec3 l = normalize(LPOS(0) - vpos);
+               diffuse += calc_diffuse(n, l, KD, LD(0)) * shadow;
+               specular += calc_specular(n, l, v, KS, LS(0)) * shadow;
+       }
+#endif
+#ifdef USE_LIGHT1
+       {
+               vec3 l = normalize(LPOS(1) - vpos);
+               diffuse += calc_diffuse(n, l, KD, LD(1)) * shadow;
+               specular += calc_specular(n, l, v, KS, LS(1)) * shadow;
+       }
+#endif
+#ifdef USE_LIGHT2
+       {
+               vec3 l = normalize(LPOS(2) - vpos);
+               diffuse += calc_diffuse(n, l, KD, LD(2)) * shadow;
+               specular += calc_specular(n, l, v, KS, LS(2)) * shadow;
+       }
+#endif
+
+#ifdef USE_CUBEMAP
+       // envmap
+       vec3 rdir = -reflect(wdir, n);
+       vec3 env_texel = textureCube(envmap, rdir).xyz;
+       specular += KS * env_texel;
+#endif // USE_CUBEMAP
+
+       vec3 ambient = gl_LightModel.ambient.rgb * KD;
+       gl_FragColor.rgb = ambient + diffuse + specular;
+#ifdef USE_TEXMAP
+       gl_FragColor.a = gl_FrontMaterial.diffuse.a * texel.a;
+#else
+       gl_FragColor.a = gl_FrontMaterial.diffuse.a;
+#endif
+}