/* vi: set ft=glsl */ uniform samplerCube envmap; uniform sampler2DShadow shadowmap; varying vec3 vdir, ldir[3], normal; varying vec4 shadow_tc; varying vec3 wdir; #define KD gl_FrontMaterial.diffuse.rgb #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 vec3 calc_diffuse(in vec3 n, in vec3 l, in vec3 lcol) { float ndotl = max(dot(n, l), 0.0); return KD * lcol * ndotl; } vec3 calc_specular(in vec3 n, in vec3 l, in vec3 v, in vec3 lcol) { vec3 h = normalize(l + v); float ndoth = max(dot(n, h), 0.0); return KS * lcol * pow(ndoth, SPOW); } void main() { float shadow = shadow2DProj(shadowmap, shadow_tc).x; vec3 n = normalize(normal); vec3 v = normalize(vdir); vec3 l = normalize(ldir[0]); vec3 diffuse = calc_diffuse(n, l, LD(0)) * shadow; vec3 specular = calc_specular(n, l, v, LS(0)) * shadow; l = normalize(ldir[1]); diffuse += calc_diffuse(n, l, LD(1)); specular += calc_specular(n, l, v, LS(1)); l = normalize(ldir[2]); diffuse += calc_diffuse(n, l, LD(2)); specular += calc_specular(n, l, v, LS(2)); // envmap vec3 rdir = -reflect(wdir, n); vec3 env_texel = textureCube(envmap, rdir).xyz; specular += KS * env_texel; vec3 ambient = gl_LightModel.ambient.rgb * KD; gl_FragColor.rgb = ambient + diffuse + specular; gl_FragColor.a = gl_FrontMaterial.diffuse.a; }