#version 130 #define MAX_SHADOWS 2 varying vec4 v_ShadowProjVector[MAX_SHADOWS]; uniform sampler2DShadow u_ShadowmapTexture[MAX_SHADOWS]; # define qfShadow2D(t,v) float(shadow2D(t,v)) uniform float u_ShadowAlpha; uniform float u_ShadowProjDistance[MAX_SHADOWS]; uniform vec4 u_ShadowmapTextureParams[MAX_SHADOWS]; void main(void) { float finalcolor = 1.0; for (int i = 0; i < MAX_SHADOWS; i++) { vec3 shadowmaptc = vec3(v_ShadowProjVector[i].xyz / v_ShadowProjVector[i].w); // this keeps shadows from appearing on surfaces behind frustum's nearplane float d = step(v_ShadowProjVector[i].w, 0.0); //shadowmaptc = (shadowmaptc + vec3 (1.0)) * vec3 (0.5); shadowmaptc.xy = shadowmaptc.xy * u_ShadowmapTextureParams[i].xy; // .x - texture width shadowmaptc.z = clamp(shadowmaptc.z, 0.0, 1.0); shadowmaptc.xy = vec2(clamp(shadowmaptc.x, 0.0, u_ShadowmapTextureParams[i].x), clamp(shadowmaptc.y, 0.0, u_ShadowmapTextureParams[i].y)); vec2 ShadowMap_TextureScale = u_ShadowmapTextureParams[i].zw; float f; f = qfShadow2D(u_ShadowmapTexture[i], vec3(shadowmaptc.xy * ShadowMap_TextureScale, shadowmaptc.z)); finalcolor *= clamp(max(max(f, d), u_ShadowAlpha), 0.0, 1.0); } gl_FragColor = vec4(vec3(finalcolor),1.0); }