///////depth map struct VS_OUT { float4 hPosition : POSITION; float4 Position : TEXCOORD0; }; VS_OUT hDepthVS(float4 position : POSITION, uniform float4x4 worldView, uniform float4x4 worldViewProj) { VS_OUT OUT; OUT.hPosition = mul(worldViewProj, position); OUT.Position = mul(worldView, position); OUT.Position.z *= -1.0; return OUT; } float4 DepthPS(VS_OUT IN ):COLOR { float dist = length(IN.Position.xyz); return float4(dist, dist, dist, 1); } ///////////////Shadow struct VS_OUT_SHADOW { float4 hPosition : POSITION; float4 Position : TEXCOORD0; }; VS_OUT_SHADOW depthShadowVS(float4 position : POSITION, uniform float4x4 world, uniform float4x4 worldViewProj) { VS_OUT_SHADOW OUT; OUT.hPosition = mul(worldViewProj, position); OUT.Position = mul(world, position); return OUT; } float4 depthShadowPS(VS_OUT_SHADOW IN, uniform float4x4 lightView, uniform float4x4 lightViewProj, uniform sampler2D depthShadowMap ):COLOR { float bias = 0.0; float4 shadowColor = float4(0.4, 0.4, 0.4, 1.0); float4 light = 1; float4 lightCamPos = mul(lightView, IN.Position); float d = length(lightCamPos.xyz); float4 lightScreenPos = mul(lightViewProj, IN.Position); lightScreenPos = lightScreenPos / lightScreenPos.w ; float dist = length(lightScreenPos.xy); if(dist < 1.0 && lightCamPos.z < 0) { lightScreenPos = ( lightScreenPos + 1.0 ) / 2.0; lightScreenPos.y = 1.0 - lightScreenPos.y; float4 storedDepth = tex2D(depthShadowMap, lightScreenPos.xy); if(storedDepth.r + bias < d) light = shadowColor; if(storedDepth.r == 0) light = 1; } else light = 1; return light; }