Hey guys, so I've got my CSM working for some time but the quality isn't really that great.
Cascades are working as intended if I distance myself from them.
I'm using the following values for the scene I've captured below:
static const float ShadowDist = 0.3f; // 0.08
static const float Backup = 5.0f;
static const float CascadeSplits[4] = { 0.125f, 0.25f, 0.5f, 1.0f };
static const float Bias = 0.008f;
static const float nearClip = 1.0f;
static const float camNear = 1.0f;
static const float camFar = 50.0f;
And the shadow map is being sampled like this:
//--------------------------------------------------------------------------------------
// Samples the shadow map cascades based on the world-space position, using edge-tap
// smoothing PCF for filtering
//--------------------------------------------------------------------------------------
float SampleShadowCascade(in float3 positionVS, in uint cascadeIdx)
{
float4x4 shadowMatrix = ShadowMatrices[cascadeIdx];
float3 shadowPosition = mul(float4(positionVS, 1.0f), shadowMatrix).xyz;
float2 shadowTexCoord = shadowPosition.xy;
float shadowDepth = shadowPosition.z;
// Edge tap smoothing
const int Radius = 2;
const float ShadowMapSize = shadowMapSize.x * 2;
const int NumSamples = (Radius * 2 + 1) * (Radius * 2 + 1);
float2 fracs = frac(shadowTexCoord.xy * ShadowMapSize);
float leftEdge = 1.0f - fracs.x;
float rightEdge = fracs.x;
float topEdge = 1.0f - fracs.y;
float bottomEdge = fracs.y;
float shadowVisibility = 0.0f;
[unroll(NumSamples)]
for (int y = -Radius; y <= Radius; y++)
{
[unroll(NumSamples)]
for (int x = -Radius; x <= Radius; x++)
{
float2 offset = float2(x, y) * (1.0f / ShadowMapSize);
float2 sampleCoord = shadowTexCoord + offset;
float sample = ShadowMap.SampleCmp(ShadowMapSampler, sampleCoord, shadowDepth).x;
float xWeight = 1;
float yWeight = 1;
if(x == -Radius)
xWeight = leftEdge;
else if(x == Radius)
xWeight = rightEdge;
if(y == -Radius)
yWeight = topEdge;
else if(y == Radius)
yWeight = bottomEdge;
shadowVisibility += sample * xWeight * yWeight;
}
}
shadowVisibility /= NumSamples;
shadowVisibility *= 1.5f;
return shadowVisibility;
}
video link here:
I just don't get how the first cascade up close would look that blocky !?
Btw the directional light is moving in this video so that's why it's flickering/moving.
Each cascade (of 4) is 256x256. 512x512 only makes the silhouettes look finer but the problem remains.
I've tried different near / far clip values but that doesn't seem to fix the issues.
Any ideas ? Haven't tried storing the depth exponentially, do you think that would help me ?
Edited by lipsryme, 07 February 2013 - 09:31 AM.






