• Advertisement
Sign in to follow this  

Shadow Map problem

This topic is 2141 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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] Edited by michaelmk86

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement