Sign in to follow this  
MARS_999

OpenGL Bleeding issue with shadowmap and objects leaving the view

Recommended Posts

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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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).

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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!

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
I've never tried it myself, just throwing suggestions out there..

Is it a precision issue with the math that doesn't work out, or just not sure how to figure the math out?

Just wondering how that worked out for you, cause I'll be tackling the same problem soon too :)

BennyW

Share this post


Link to post
Share on other sites
More the latter. I am thinking one should be able to use more than one shadowmap since PSSM uses more than one shadowmap, as well as other methods that are around the net.

Share this post


Link to post
Share on other sites
MARS_999: I am using PSSM for directional lights. The viewport hack is not necessary because you can setup user clip planes for each split pass.

AndyTX: I agree. The 'trick' only works with medium-high resolution shadow maps.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this