I am shadow mapping in Direct3D 9. I'm trying to avoid rendering depth to a 32-bit render target. So, I've created a depth/stencil texture( a texture w/usage Depth/Stencil ). When I render I do this:
//device
IDirect3DDevice9 *pd3dDevice = GetDevice();
// set an rt the same size as the depth/stencil texture(needs attention...this render target will not be rendered to)
pd3dDevice->SetRenderTarget(0, GetShadowMapRT());
// set the shadow map depth/stencil texture surface
pd3dDevice->SetDepthStencilSurface(GetShadowMapDSSurface());
pd3dDevice.SetStreamSource(0, GDEOctree.Geometry,
Constants.OctreeVertexSize * GDEOctree.StaticGeometryVertexCount, 12);
// set vertex format
pd3dDevice.VertexFormat = SlimDX.Direct3D9.VertexFormat.Position;
// set indices
pd3dDevice.Indices = GDEOctree.ShadowCasterIndices;
// set render states
DeviceManager.SetRenderState(RenderState.ZEnable, 1);
DeviceManager.SetRenderState(RenderState.ZWriteEnable, 1);
DeviceManager.SetRenderState(RenderState.ZFunc, (int)Compare.LessEqual);
DeviceManager.SetRenderState(RenderState.CullMode, (int)Cull.Counterclockwise);
DeviceManager.SetRenderState(RenderState.StencilEnable, 0);
DeviceManager.SetRenderState(RenderState.AlphaBlendEnable, 0);
DeviceManager.SetRenderState(RenderState.ColorWriteEnable, 0);
// draw shadow casting geometry
...
// get the effect
ID3DXEffect *pFX = GetFX();
// set the shadow map depth/stencil texture
pFX->SetTexture(GetShadowMapDSTexture());
// in pixel shader sample shadow map...
?
The problem is that the depth/stencil texture is a D24SX format...How do I sample from a texture of this format?
My original attempt which of course will not work:
tex2D(g_SamplerShadowMap, vShadowMapUV);
I read a post here that says:
When reading from the texture, one extra component in texture coordinates will be the depth to compare with.
Or, how do I convert the color returned from the sampler code above to a single floating point value? The above code will return a 4-component vector but depth should be one value for comparison.
EDIT:
Below is the vertex shader for the shadow map pass...I do not compile a pixel shader for the shadow map pass because color is not written...only depth.
//--------------------------------------------------------------//
// ShadowMap Pass
//--------------------------------------------------------------//
void VS_ShadowMap( in float4 Position : POSITION0,
out float4 oPos : POSITION0 )
{
// position of geometry in the shadow emitting light's clip space
oPos = mul(mul(Position, mW), g_mShadowViewProjection);
}
technique DeferredShading
{
pass ShadowMap
{
VertexShader = compile vs_3_0 VS_ShadowMap();
PixelShader = NULL;
}
}