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.