#version 110 varying vec4 vPos; varying vec3 vNrm; varying vec4 vShadowCoord0; varying vec4 vShadowCoord1; varying vec4 vShadowCoord2; varying vec4 vColor; uniform sampler2D shadow_map0; uniform sampler2D shadow_map1; uniform sampler2D shadow_map2; uniform sampler2D current_texture; uniform float enable_lighting; uniform float enable_texture; uniform float enable_shadow; uniform vec3 camera; vec4 PhongShading(void) { vec3 N = normalize(vNrm); vec3 L = normalize(gl_LightSource[0].position.xyz-vPos.xyz); if(gl_LightSource[0].position.w < 0.5){ L = normalize(gl_LightSource[0].position.xyz); } vec4 ambient = gl_FrontLightProduct[0].ambient; float dcoef = max(dot(L, N), 0.0); vec4 diffuse = gl_FrontLightProduct[0].diffuse * dcoef; vec4 specular = vec4(0.0); if(dcoef > 0.0){ vec3 V = normalize(-vPos.xyz); vec3 H = normalize(L + V); float specularLight = pow(max(dot(N, H), 0.0), gl_FrontMaterial.shininess); specular = gl_FrontLightProduct[0].specular * specularLight; } return ambient+diffuse+specular; } float SampleShadow(sampler2D shadowMap, vec4 shadowCoord) { vec3 shadow_c = shadowCoord.xyz / shadowCoord.w; float view = shadow_c.z; float shadow_coef = 1.0; vec2 d[4]; int i; if(shadow_c.z > 1.0) return 1.0; d[0] = vec2(-0.94201624, -0.39906216); d[1] = vec2(0.94558609, -0.76890725); d[2] = vec2(-0.094184101, -0.92938870); d[3] = vec2(0.34495938, 0.29387760); for(i = 0; i < 4; i++){ vec2 p = shadow_c.xy + d[i] / 700.0; if(p.x < 0.0 || p.y < 0.0 || p.x > 1.0 || p.y > 1.0) shadow_coef += 1.0; if(texture2D(shadowMap, p).z < view){ shadow_coef -= 0.2; } } return shadow_coef; } float ShadowCoef(void){ float dist = length(normalize(camera + gl_LightSource[0].position.xyz) - vPos.xyz); if(gl_LightSource[0].position.w > 0.5){ if(dist >= 10.0) return 1.0; } if(dist < 10.0) return SampleShadow(shadow_map0, vShadowCoord0); if(dist < 40.0) return SampleShadow(shadow_map1, vShadowCoord1); return SampleShadow(shadow_map2, vShadowCoord2); } void main(void){ vec4 c = PhongShading(); vec4 ambient = gl_LightSource[0].ambient; float shadow_coef = 1.0; if(enable_shadow >= 0.5){ shadow_coef = ShadowCoef(); } if(enable_texture >= 0.5){ c = c * texture2D(current_texture, gl_TexCoord[0].st); } gl_FragColor = ambient * shadow_coef * c + (1.0 - ambient) * c; gl_FragColor.a = vColor.a; }