Bleeding issue with shadowmap and objects leaving the view

Started by
11 comments, last by Sergi 17 years, 5 months ago
How can I get rid of this problem? errors I am thinking what is happening is when the camera moves and the objects leave the shadowmap it goes nuts. What can one do to stop this or is there nothing you can do? Thanks BTW using OpenGL
Advertisement
The simplest solution is leaving an empty border in the shadowmap (initialize the pixels in the border to the max depth { 1.0 } ) and readjust the shadowmap viewport before rendering to the shadowmap:

glViewport(1,1,shadowmap_width-2,shadowmap_height-2)


Now, the shadow map test will accept all pixels in the border.
Ok, I would like to figure out how to get this idea to work. I think the projection texture coordinates are outside 0-1 range. So when I use discard or kill on the fragments it seems to work but then my terrain doesn't render either. So how can I fix that issue? Anyone have any ideas. Thanks
You should not discard the fragment because it will not be rasterized.
Your code should be similar to the following lines:

// intensity = DotProduct(normal,lightDir)
// ...

float depth = tex2D(shadowMap,shadowCoord).x;
if (depth < shadowCoord.z) // pixel is shadowed
{
intensity = 0.0;
}

If you have initialized the shadow map borders to max depth, all the projection texture coordinates outside of range (0..1) will give depth = 1.0, therefore the light intensity remains unchanged (1.0 < 1.0 == false).
Quote:Original post by Sergi
The simplest solution is leaving an empty border in the shadowmap (initialize the pixels in the border to the max depth { 1.0 } ) and readjust the shadowmap viewport before rendering to the shadowmap:

Note that this technically means that you need to readjust your projection into shadow map space as well... it's not longer as simple as x * 0.5 + 0.5! It's not complex per se, but there is an easier way...

Set a border color on your texture (that is your maximum depth range) and use "clamp to border". Don't know if/how this will work if you're using a depth texture, but should work like a charm for standard textures.
Sergi that didn't work... Still bleeds over a bit.

Andy that idea may work, but I get a black bar at the edges and I cleared the depth buffer with 0 and 1 no difference.
AndyTX: I think it's not possible to setup the border color of depth textures (neither nvidia nor ati cards).

MARS_999: It should work using the standard bias matrix (although the shadow map lookup will be 1 pixel offseted). However, if you want to use a perfect bias matrix, maybe the following one works:

float tx = 0.5f/shadowmap_width;
float ty = 0.5f/shadowmap_height;

float biasMatrix[] = {
0.5f-tx, 0.0f, 0.0f, 0.0f,
0.0f, 0.5f-ty, 0.0f, 0.0f,
0.0f, 0.0f, 0.5f, 0.0f,
0.5f+tx, 0.5f+ty, 0.5f, 1.0f};// 1 texel offseted to the right

The matrix (lsvp) used in the vertex shader (of the second pass) to transform from world space to shadow map space should be:

lsvp = lvp * bias;

where lvp is the viewprojection matrix used to render the objects of the shadowmap.

If the errors still are visible, please make a screenshot of the scene with the light rendered (the light view frustum) and let me see it.
Quote:Original post by Sergi
AndyTX: I think it's not possible to setup the border color of depth textures (neither nvidia nor ati cards).

Hmm, ok... yet another point against depth textures in my books :)

Quote:Original post by Sergi
MARS_999: It should work using the standard bias matrix (although the shadow map lookup will be 1 pixel offseted).

It's not just offset, it's center-scaled by size / (size - 2) as well, which makes it a bit more complicated. Depending on your shadow map resolution, the difference might be minimal, but misaligning the shadow texels will exacerbate depth biasing problems!

You can use more shadow maps to help cover the view. Requires some management, but you won't have to worry about abrubt ends in the shadows.

BennyW
Tried that but can't figure out how to get them to align correctly so one edge matches the next one...

This topic is closed to new replies.

Advertisement