X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=ld37_one_room;a=blobdiff_plain;f=sdr%2Fuber.p.glsl;fp=sdr%2Fuber.p.glsl;h=ee5c0f1219fe6170f7a2b52e5a2a2abf50dffd3d;hp=0000000000000000000000000000000000000000;hb=f8ad31b8b1856784aefdd3457b6b8f5cb5576892;hpb=cc8a355e7b709f3eb1132cd6b63cf4e482d58332 diff --git a/sdr/uber.p.glsl b/sdr/uber.p.glsl new file mode 100644 index 0000000..ee5c0f1 --- /dev/null +++ b/sdr/uber.p.glsl @@ -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 +}