Jump to content

  • Log In with Google      Sign In   
  • Create Account


Shadow mapping 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
2 replies to this topic

#1 Sesha   Members   -  Reputation: 107

Like
0Likes
Like

Posted 27 June 2013 - 09:48 PM

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.



Sponsor:

#2 ankhd   Members   -  Reputation: 1221

Like
0Likes
Like

Posted 28 June 2013 - 02:21 AM

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.



#3 Sesha   Members   -  Reputation: 107

Like
0Likes
Like

Posted 28 June 2013 - 10:37 AM

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.

Attached Thumbnails

  • Shadowmap.jpg





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