X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=antikythera;a=blobdiff_plain;f=sdr%2Fshadow-notex.p.glsl;fp=sdr%2Fshadow-notex.p.glsl;h=dac400f84eca5f1972c833436781713c2acb1ca4;hp=0000000000000000000000000000000000000000;hb=ccc1a688b59e25bb934a0d3e2bbf477960068d4f;hpb=080d7a779d43f549fc16c44e709cbf5989180fdf diff --git a/sdr/shadow-notex.p.glsl b/sdr/shadow-notex.p.glsl new file mode 100644 index 0000000..dac400f --- /dev/null +++ b/sdr/shadow-notex.p.glsl @@ -0,0 +1,56 @@ +/* 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; +}