Shadow Map problem

Started by
4 comments, last by michaelmk86 11 years, 10 months ago
I cannot get the Shadow Map to work, here is what done so far, any suggestion will be helpful.

Edit: I beleve that the problem is how I clear the IDirect3DDevice9 (Device) before I start the "ShadowedScene" technique.



Device->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0L);

lightingFX.fx->SetTechnique("ShadowMap");
UINT numPassess = 0;
lightingFX.fx->Begin(&numPassess,0);

//////////////////////////////////////////////snip////////////////////////////////////////////////////////
for (unsigned int i = 1; i<numMtrls; i++)
{
lightingFX.fx->BeginPass(0);
lightingFX.fx->SetTexture("xTexture", texture);
lightingFX.fx->SetTexture("xShadowMap", texture);
lightingFX.fx->CommitChanges();
mesh->DrawSubset(i);
lightingFX.fx->EndPass();
}
//////////////////////////////////////////////snip////////////////////////////////////////////////////////


lightingFX.fx->End();

Device->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0L);
Device->BeginScene();


lightingFX.fx->SetTechnique("ShadowedScene");
UINT numPasses = 0;
lightingFX.fx->Begin(&numPasses,0);

//////////////////////////////////////////////snip////////////////////////////////////////////////////////
for (unsigned int i = 1; i<numMtrls; i++)
{
lightingFX.fx->BeginPass(0);
lightingFX.fx->SetTexture("xTexture", texture);
lightingFX.fx->SetTexture("xShadowMap", texture);
lightingFX.fx->CommitChanges();
mesh->DrawSubset(i);
lightingFX.fx->EndPass();
}
//////////////////////////////////////////////snip////////////////////////////////////////////////////////

lightingFX.fx->End();

Device->EndScene();
Device->Present(0,0,0,0);

[/quote]


HLSL file


float4x4 xWorldViewProjection;
float4x4 xLightsWorldViewProjection;
float4x4 xWorld;
float3 xLightPos;
float xLightPower;
float xAmbient;
float4 xColor = float4(1, 0.8, 0.8, 0);

Texture xTexture;

sampler TextureSampler = sampler_state { texture = <xTexture> ; magfilter = LINEAR; minfilter = LINEAR; mipfilter=LINEAR; AddressU = Wrap; AddressV = Wrap;};

Texture xShadowMap;

sampler ShadowMapSampler = sampler_state { texture = <xShadowMap> ; magfilter = LINEAR; minfilter = LINEAR; mipfilter=LINEAR; AddressU = clamp; AddressV = clamp;};

float DotProduct(float3 lightPos, float3 pos3D, float3 normal)
{
float3 lightDir = normalize(pos3D - lightPos);
return dot(-lightDir, normal);
}

struct SMapVertexToPixel
{
float4 Position : POSITION;
float4 Position2D : TEXCOORD0;
};

struct SMapPixelToFrame
{
float4 Color : COLOR0;
};


SMapVertexToPixel ShadowMapVertexShader( float4 inPos : POSITION)
{
SMapVertexToPixel Output = (SMapVertexToPixel)0;

Output.Position = mul(inPos, xLightsWorldViewProjection);
Output.Position2D = Output.Position;

return Output;
}

SMapPixelToFrame ShadowMapPixelShader(SMapVertexToPixel PSIn)
{
SMapPixelToFrame Output = (SMapPixelToFrame)0;

Output.Color = PSIn.Position2D.z/PSIn.Position2D.w;

return Output;
}


technique ShadowMap
{
pass Pass0
{
VertexShader = compile vs_2_0 ShadowMapVertexShader();
PixelShader = compile ps_2_0 ShadowMapPixelShader();
}
}


struct SSceneVertexToPixel
{
float4 Position : POSITION;
float4 Pos2DAsSeenByLight : TEXCOORD0;

float2 TexCoords : TEXCOORD1;
float3 Normal : TEXCOORD2;
float4 Position3D : TEXCOORD3;

};

struct SScenePixelToFrame
{
float4 Color : COLOR0;
};


SSceneVertexToPixel ShadowedSceneVertexShader( float4 inPos : POSITION, float2 inTexCoords : TEXCOORD0, float3 inNormal : NORMAL)
{
SSceneVertexToPixel Output = (SSceneVertexToPixel)0;

Output.Position = mul(inPos, xWorldViewProjection);
Output.Pos2DAsSeenByLight = mul(inPos, xLightsWorldViewProjection);
Output.Normal = normalize(mul(inNormal, (float3x3)xWorld));
Output.Position3D = mul(inPos, xWorld);
Output.TexCoords = inTexCoords;

return Output;
}

SScenePixelToFrame ShadowedScenePixelShader(SSceneVertexToPixel PSIn)
{
SScenePixelToFrame Output = (SScenePixelToFrame)0;

float2 ProjectedTexCoords;
ProjectedTexCoords[0] = PSIn.Pos2DAsSeenByLight.x/PSIn.Pos2DAsSeenByLight.w/2.0f +0.5f;
ProjectedTexCoords[1] = -PSIn.Pos2DAsSeenByLight.y/PSIn.Pos2DAsSeenByLight.w/2.0f +0.5f;

float diffuseLightingFactor = 0;
if ((saturate(ProjectedTexCoords).x == ProjectedTexCoords.x) && (saturate(ProjectedTexCoords).y == ProjectedTexCoords.y))
{
float depthStoredInShadowMap = tex2D(ShadowMapSampler, ProjectedTexCoords).r;
float realDistance = PSIn.Pos2DAsSeenByLight.z/PSIn.Pos2DAsSeenByLight.w;
if ((realDistance - 1.0f/100.0f) <= depthStoredInShadowMap)
{
diffuseLightingFactor = DotProduct(xLightPos, PSIn.Position3D, PSIn.Normal);
diffuseLightingFactor = saturate(diffuseLightingFactor);
diffuseLightingFactor *= xLightPower;
}
}

float4 baseColor = tex2D(TextureSampler, PSIn.TexCoords);
Output.Color = baseColor*(diffuseLightingFactor + xAmbient)*xColor;

return Output;
}


technique ShadowedScene
{
pass Pass0
{
VertexShader = compile vs_2_0 ShadowedSceneVertexShader();
PixelShader = compile ps_2_0 ShadowedScenePixelShader();
}
}

[/quote]
Advertisement
Please use the tags when posting source code here, so that you get proper formatting. Also, people will be able to help you better if you're more descriptive about your actual problem. For instance, what is the current result produced by your code? Do you get know shadows at all? Shadows everywhere? Shadows in the wrong place? A screenshot of the problem can be helpful, if applicable.

Please use the tags when posting source code here, so that you get proper formatting. Also, people will be able to help you better if you're more descriptive about your actual problem. For instance, what is the current result produced by your code? Do you get know shadows at all? Shadows everywhere? Shadows in the wrong place? A screenshot of the problem can be helpful, if applicable.

I don't get shadows at all, in fact it doesn't make any difference if I begin my "ShadowMap" technique or not.
I beleve that the problem is how I clear the IDirect3DDevice9 (Device) before I start the "ShadowedScene" technique.
I still haven't figured out that is wrong.
Any info from debug runtime?
Pix output?

It's hard withoud details!

Any info from debug runtime?
Pix output?

It's hard withoud details!

The hlsl should not be the problem since it is from this tutorial http://www.riemers.n...Real_shadow.php but the tutorial only explain how to use it with XNA and not with C++ & DX9. I am only asking how to properly clear the IDirect3DDevice9 (Device) before and after the "ShadowedScene" technique.

This topic is closed to new replies.

Advertisement