// Percentage closer soft shadows // nVidia implementation // SHADOWMAP generation //----------------------------------------------------------------------------- // Vertex Shader: RenderShadowMap_06_VS // Desc: Process vertex for the shadow map //----------------------------------------------------------------------------- void RenderShadowMap_06_VS( float4 Pos : POSITION, out float4 oPos : POSITION, out float hPos : TEXCOORD0 ) { oPos = mul( Pos, WorldLightProj ); // Compute the projected coordinates hPos = oPos.w; // Store z in our spare texcoord } //----------------------------------------------------------------------------- // Pixel Shader: RenderShadowMap_06_PS // Desc: Process pixel for the shadow map //----------------------------------------------------------------------------- float4 RenderShadowMap_06_PS( float hPos : TEXCOORD0 ):COLOR { return float4(hPos,0,0,0); } // SCENE RENDERING //----------------------------------------------------------------------------- // Vertex Shader: RenderSceneWithTechnique_06_VS // Desc: Process vertex for scene //----------------------------------------------------------------------------- VS_OUTPUT RenderSceneWithTechnique_06_VS( VS_INPUT IN ) { VS_OUTPUT OUT = (VS_OUTPUT)0; OUT.Color = IN.Color; OUT.Tex = IN.Tex; // transform model-space vertex position to light's normalized device space: OUT.ldPosition = mul(IN.Position, WorldLightProj); // transform model-space vertex position to normalized screen space: OUT.hPosition = mul(IN.Position, WorldViewProj); return OUT; } //----------------------------------------------------------------------------- // Pixel Shader: RenderSceneWithTechnique_06_PS // Desc: PCF soft shadow //----------------------------------------------------------------------------- // ------------------------------------- // STEP 1: Search for potential blockers // ------------------------------------- half findBlocker( half2 uv, half4 LP, half searchWidth ) { // divide filter width by number of samples to use half stepSize = 2 * searchWidth / g_iKernelSize; // compute starting point uv coordinates for search uv = uv - half2(searchWidth, searchWidth); // reset sum to zero half blockerSum = 0; half receiver = LP.z; half blockerCount = 0; half foundBlocker = 0; // iterate through search region and add up depth values for (int i=0; i 998) shadowed = 1.0; // Visualize lighting and shadows if( shadowed < 1.0 ) { shadowed *= g_fBiasSlope; if( shadowed > 1.0 ) { shadowed = 1.0; } } return tex2D(g_samScene, IN.Tex) * shadowed * g_vMaterial; } // TECHNIQUE //----------------------------------------------------------------------------- // Techniques: RenderShadowMap // Desc: Render the shadow map //----------------------------------------------------------------------------- technique RenderShadowMap_6 { pass p0 { VertexShader = compile vs_2_0 RenderShadowMap_06_VS(); PixelShader = compile ps_2_0 RenderShadowMap_06_PS(); } } technique RenderSceneWithTechnique_6 { pass p0 { VertexShader = compile vs_2_0 RenderSceneWithTechnique_06_VS(); PixelShader = compile ps_3_0 RenderSceneWithTechnique_06_PS(); } }