Click to See Complete Forum and Search --> : PSSM and derferred shading (unfilled shadow)


akira32
March 16th, 2009, 03:06 AM
I meet a problem about using PSSM(Parallel-Split Shadow Maps) to render the shadow to a shadow result texture (restore the shadow pixel, 1 means lighted, 0 means shadowed). The shadow result texture is a render target texture with the format of R32F. My problem is that if I render a flag model in PS_SRT (pixel shader to generate shadow result texture) and using "return fLightingFactor;", I will see the nofilled shadow. If I using "return float4(fLightingFactor,1.0f,1.0f,1.0f);" in PS_SRT, I will see the filled shadow.

The filled shadow: http://cid-fbeb6373d9321a7f.skydrive.live.com/self.aspx/Questions/shadow/PSSM%7C_shadow%7C_fill.JPG
The unfilled shadow: http://cid-fbeb6373d9321a7f.skydrive.live.com/self.aspx/Questions/shadow/PSSM%7C_shadow%7C_notfill.JPG

The filled shadow also has a stranger aliasing problem. The program is written by my lowerclassman. I implement PSSM into this program. I also implement the PSSM into my MapEditor, but my MapEditor has no this stranger shadow aliasing and no unfilled problem---no matter the return statement ("return fLightingFactor;" or "return float4(fLightingFactor,1.0f,1.0f,1.0f);" ).(My MapEditor's flag shadow : http://cid-fbeb6373d9321a7f.skydrive.live.com/self.aspx/Questions/shadow/PSSM%7C_shadow%7C_fill%7C_ME%7C_no%7C_aliasing.JPG).

These are my partial shader code:


void VS_RenderShadowMap(
float4 vPos : POSITION,
out float4 vPosOut : POSITION,
out float3 vPixelOut : TEXCOORD0)
{
// pass vertex position through as usual
vPosOut = mul(vPos, wvp);
// output pixel pos
vPixelOut=vPosOut.xyz;
}

float4 PS_RenderShadowMap(float3 vPixelPos : TEXCOORD0): COLOR
{
// write z coordinate (linearized depth) to texture
return vPixelPos.z;
}


// This technique is used when rendering meshes to the shadowmap
//
technique RenderShadowMap
{
pass p0
{
// render back faces to hide artifacts
CullMode = CW;
ZWriteEnable=TRUE;
ZEnable=TRUE;
VertexShader = compile vs_3_0 VS_RenderShadowMap();
PixelShader = compile ps_3_0 PS_RenderShadowMap();
}
}

void VS_SRT(
in float4 vPos : POSITION,
in float3 vNormal : NORMAL,
in float4 vDiffuseTex : TEXCOORD0,
out float4 vPosOut : POSITION,
out float4 vShadowTex : TEXCOORD0,
out float4 vDiffuseTexOut : TEXCOORD1
)
{
// pass vertex position through as usual
vPosOut = mul(vPos, wvp);

// coordinates for shadowmap
vShadowTex = mul(vPos, g_mShadowMap);
vDiffuseTexOut=vDiffuseTex;
}

float4 PS_SRT(
float4 vShadowTex : TEXCOORD0,
float4 vDiffuseTex: TEXCOORD1
) : COLOR
{

float4 Color=tex2D(DiffuseMapSampler1, vDiffuseTex);
if (Color.a<0.5f)
{
discard;
}

//float fTexelSize=1.0f/g_fShadowMapSize;

// project texture coordinates
vShadowTex.xy/=vShadowTex.w;

.......
if (g_bUseColorfulSplit==true)
{
.......

#ifdef _RETURN_FLOAT4_
return float4(fLightingFactor,1.0f,1.0f,1.0f);
#else
return fLightingFactor;
#endif
}

}

technique generateSRT
{
pass p0
{
// render front faces
//CullMode = CCW;
CullMode=CCW;
ZWriteEnable=TRUE;
ZEnable=TRUE;

VertexShader = compile vs_3_0 VS_SRT();
PixelShader = compile ps_3_0 PS_SRT();
}
}