Jump to content
  • Advertisement
Sign in to follow this  
MARS_999

OpenGL Bleeding issue with shadowmap and objects leaving the view

This topic is 4272 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

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
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.

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
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!