Jump to content
  • Advertisement
Sign in to follow this  
Fabonymous

Depth-testing in the fragment shader

This topic is 2226 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

Hi,

I'm currently trying to implement a fragment shader that discards all fragments that have a great distance to the current depth value. The wished for effect: clipping decals. All fragments near to a wall get rendered. All fragments that are overlaping should get discard.

My setup is as follows:

1. Render the scene into a framebuffer object with a depth buffer attached.
2. Load the depth buffer as texture into the fragment shader.
3. Render the decals

In the fragment shader I have now two depth values, one from gl_FragCoord and one from the texture. Let calls them: fragDepth and textDepth.


float fragDepth = gl_FragCoord.z;
float textDepth = texture2D( depth_texture, gl_FragCoord.xy ).r;


So far, so good. But the next step fails (flickering/does not what it should):

float depthDiff = textDepth - fragDepth;
float threshold = 0.005;

if( depthDiff > threshold )
{
discard;
}


I'm assuming this fails due to precision issues (?)
What is the best way to proceed? Linearize the depth values? Or am I here completly on the wrong path?

Share this post


Link to post
Share on other sites
Advertisement
Any reason not to just use standard depth testing? It will run better and give you more predictable results.

Share this post


Link to post
Share on other sites

Any reason not to just use standard depth testing? It will run better and give you more predictable results.


With standard depth testing, glDepthFunc(GLenum func), you can only specify simple test like "GL_LESS", "GL_GREATER", ... as far as I understand, it is not possible to do more complicated processing in the Depth Testing pipeline stage. Maybe it is possible with running multiple passes or an extension, I don't know. That's why I'm asking :-)

Share this post


Link to post
Share on other sites
I would look at example implmentations of soft particles as this is a similar test to what you want to do

Share this post


Link to post
Share on other sites
Is there a reason why ::glPolygonOffset() will not work? It works for standard decals. Are yours not standard?


L. Spiro

Share this post


Link to post
Share on other sites

Is there a reason why ::glPolygonOffset() will not work? It works for standard decals. Are yours not standard?


L. Spiro


As far as I know is glPolygonOffset() used to avoid z-fighting. Can it also be used for clipping?

Share this post


Link to post
Share on other sites
Clipping in what way? What do you want to clip? Perhaps you should explain in what way your decal system differs from the standard.
Your original post says, “clipping decals”. I don’t see what the purpose of doing that is. Z-fighting is the only issue there is to overcome with standard decals.


L. Spiro

Share this post


Link to post
Share on other sites
@L.Spiro:
I believe Fabonymous is referring to clipping decals so they dont overhang geometry - for example a splash-damage decal on the edge of a wall.

@Fabonymous:
If this is the case, I don't think depth clipping is viable either as a moving object can end up having polygons close enough to co-planar with the decal sprite, and as a result get drawn to as well. Depending on your platform, there are a few easier ways of solving it, for example performing clipping and rejection in a geometry shader and writing out to a decal vertex buffer.

Share this post


Link to post
Share on other sites
@Digitalfragment, I come to agree that depth clipping might be the wrong approach. Do you have references/sample code/tutorial on how to implement the clipping stage in a geometry shader?

Share this post


Link to post
Share on other sites

@Digitalfragment, I come to agree that depth clipping might be the wrong approach. Do you have references/sample code/tutorial on how to implement the clipping stage in a geometry shader?


DICE has a presentation. It's complicated. You may not want to give up on projected decals so easily...games have shipped with it. smile.png

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!