Jump to content

  • Log In with Google      Sign In   
  • Create Account

FREE SOFTWARE GIVEAWAY

We have 4 x Pro Licences (valued at $59 each) for 2d modular animation software Spriter to give away in this Thursday's GDNet Direct email newsletter.


Read more in this forum topic or make sure you're signed up (from the right-hand sidebar on the homepage) and read Thursday's newsletter to get in the running!


Shadow Map problem


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
5 replies to this topic

#1 michaelmk86   Members   -  Reputation: 189

Like
0Likes
Like

Posted 03 June 2012 - 01:23 PM

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[i]);
			lightingFX.fx->SetTexture("xShadowMap", texture[i]);
			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[i]);
			lightingFX.fx->SetTexture("xShadowMap", texture[i]);
			lightingFX.fx->CommitChanges();
			mesh->DrawSubset(i);
			lightingFX.fx->EndPass();	
		}
	//////////////////////////////////////////////snip////////////////////////////////////////////////////////

	lightingFX.fx->End();

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



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();
	}
}


Edited by michaelmk86, 03 June 2012 - 05:15 PM.


Sponsor:

#2 MJP   Moderators   -  Reputation: 11790

Like
0Likes
Like

Posted 03 June 2012 - 04:26 PM

Please use the [code=auto:0] 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.

#3 michaelmk86   Members   -  Reputation: 189

Like
0Likes
Like

Posted 03 June 2012 - 05:14 PM

Please use the [code=auto:0] 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.

#4 michaelmk86   Members   -  Reputation: 189

Like
0Likes
Like

Posted 07 June 2012 - 01:43 PM

I still haven't figured out that is wrong.

#5 XVincentX   Members   -  Reputation: 129

Like
0Likes
Like

Posted 08 June 2012 - 01:13 AM

Any info from debug runtime?
Pix output?

It's hard withoud details!

#6 michaelmk86   Members   -  Reputation: 189

Like
0Likes
Like

Posted 09 June 2012 - 11:58 AM

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.




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS