Sign in to follow this  

Shadow mapping problem

This topic is 1664 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

Hello people, I am tring shadow mapping in directx 9 with HLSL. My system config Dual core, 1.5 GB RAM, ATI RADON 6600.

My Problem is i am getting the shadow map but it fails to produce shadow. I am following Frank D Luna's book.

Attached my HLSL code.

float4x4 matWorldViewProjection;
float4x4 matWorldInverseTranspose;
float4x4 matWorld;
float4x4 matLWorld;
float3 EyePos;
texture gTex;
texture gShadowMap;

float3 LightDirection;
float4 Ambient;
float4 Diffuse;
float4 Specular;
float SpecularPower;

float4x4 MatrixPalette[35];
int numBoneInfluence = 2;
static const float SHADOW_EPSILON = 0.00005f;
static const float SMAP_SIZE = 512.0f;

sampler Texture = sampler_state
{
   Texture   = (gTex);
   ADDRESSU  = WRAP;
   ADDRESSV  = WRAP;
   MAGFILTER = Anisotropic;
   MINFILTER = Anisotropic;
   MIPFILTER = Anisotropic;
   MAXANISOTROPY = 2;
};

sampler ShadowMapS = sampler_state
{
	Texture   = (gShadowMap);
	MinFilter = POINT;
	MagFilter = POINT;
	MipFilter = POINT;
	AddressU  = CLAMP; 
    AddressV  = CLAMP;
};

struct VSHADOW_OUTPUT 
{
   float4 Position     : POSITION0;
   float2 Depth        : TEXCOORD0;
};

struct VSHADOW1_OUTPUT 
{
   float4 Position     : POSITION0;
   float3 Normal       : TEXCOORD0;
   float3 PosW         : TEXCOORD1;
   float2 TextureCoord : TEXCOORD2;
   float4 ProjTex      : TEXCOORD3;
};

VSHADOW_OUTPUT BuildShadowMapVS(float4 Position : POSITION0)
{
    VSHADOW_OUTPUT OutputSh;
	
    OutputSh.Position = mul( Position, matLWorld );
    
    OutputSh.Depth.x = Position.z;
    OutputSh.Depth.y = Position.w;
   
    return OutputSh;
};

float4 BuildShadowMapPS(float2 Depth : TEXCOORD0) : COLOR
{
	return (Depth.x/Depth.y);
}

technique BuildShadowTech
{
   pass P0
   {
      VertexShader = compile vs_2_0 BuildShadowMapVS();
      PixelShader  = compile ps_2_0 BuildShadowMapPS();
   }
}

VSHADOW1_OUTPUT LightShadowVS( float4 Position : POSITION0, float3 Normal : NORMAL0, float2 TextureCoord : TEXCOORD0 )
{
   VSHADOW1_OUTPUT Output;
   
   Output.Position = mul( Position, matWorldViewProjection );
   
   Output.Normal = mul( Normal, matWorldInverseTranspose);
   
   Output.PosW = mul( Position, matWorld);
   
   Output.TextureCoord = TextureCoord;
   
   Output.ProjTex = mul( Position, matLWorld );
   
   return Output; 
}

float4 LightShadowPS(float3 normal : TEXCOORD0, float3 posW : TEXCOORD1, float2 TextureCoord : TEXCOORD2, float4 ProjTex : TEXCOORD3) : COLOR0
{
   normal = normalize(normal);
   posW   = normalize(posW);
   float3 light = normalize(LightDirection);
   float3 toEye = normalize(EyePos - posW);
   
   float3 r = reflect(-light, normal);
   float  t = pow(max(dot(r, toEye), 0.0f), SpecularPower);
   float  diffuseContribution = max(dot(normal, light), 0.0f);
   
   float4 tex      = tex2D(Texture, TextureCoord);
   float4 ambient  = Ambient * tex;
   float4 diffuse  = Diffuse * tex * diffuseContribution;
   float4 specular = Specular * tex * t;
   
   ProjTex.xy /= ProjTex.w;
   ProjTex.x =  0.5f*ProjTex.x + 0.5f;
   ProjTex.y = -0.5f*ProjTex.y + 0.5f;
   
   float depth = ProjTex.z / ProjTex.w;
   
   float2 texelpos = SMAP_SIZE * ProjTex.xy;
   float2 lerps = frac( texelpos );
   float dx = 1.0f / SMAP_SIZE;
   
   float s0 = (tex2D(ShadowMapS, ProjTex.xy).r + SHADOW_EPSILON < depth) ? 0.0f : 1.0f;
   float s1 = (tex2D(ShadowMapS, ProjTex.xy + float2(dx, 0.0f)).r + SHADOW_EPSILON < depth) ? 0.0f : 1.0f;
   float s2 = (tex2D(ShadowMapS, ProjTex.xy + float2(0.0f, dx)).r + SHADOW_EPSILON < depth) ? 0.0f : 1.0f;
   float s3 = (tex2D(ShadowMapS, ProjTex.xy + float2(dx, dx)).r   + SHADOW_EPSILON < depth) ? 0.0f : 1.0f;
   
   float shadowCoeff = lerp( lerp( s0, s1, lerps.x ), lerp( s2, s3, lerps.x ), lerps.y );
   
   return float4(ambient + diffuse*shadowCoeff + specular*shadowCoeff);
}

technique DrawShadowTech
{
   pass P0
   {
      VertexShader = compile vs_2_0 LightShadowVS();
      PixelShader  = compile ps_2_0 LightShadowPS();
   }
}

Please help me i am stuck with this.

Thanks in advance.

Share this post


Link to post
Share on other sites

hi there.

Try playing with thisa value here SHADOW_EPSILON = 0.00005f;

I have it set to this here 0.005f; but Im using large sized mesh scaled.I think the size of the mesh changes the output shadow some what

at least it does in mine lol.

Share this post


Link to post
Share on other sites

I gave a try what you had adviced but didnt worked.I dont understand the logic why u asked me to do that.

What i suspect is whether i am handling the ProjTex correctly.I can understand I miss something silly, but dont know what it is.

 

I had attached an image, in which i had textured the plain with the rendered shadowmap.

 

Worrying is shadow is not drawn.

Share this post


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