Shadow mapping problem

Started by
1 comment, last by Sesha 10 years, 10 months ago

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.

Advertisement

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.

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.

This topic is closed to new replies.

Advertisement