Depth-testing in the fragment shader

Started by
9 comments, last by BigStink 11 years, 9 months ago
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?
Advertisement
Any reason not to just use standard depth testing? It will run better and give you more predictable results.

Direct3D has need of instancing, but we do not. We have plenty of glVertexAttrib calls.


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 :-)
I would look at example implmentations of soft particles as this is a similar test to what you want to do
Is there a reason why ::glPolygonOffset() will not work? It works for standard decals. Are yours not standard?


L. Spiro

I restore Nintendo 64 video-game OST’s into HD! https://www.youtube.com/channel/UCCtX_wedtZ5BoyQBXEhnVZw/playlists?view=1&sort=lad&flow=grid


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

I restore Nintendo 64 video-game OST’s into HD! https://www.youtube.com/channel/UCCtX_wedtZ5BoyQBXEhnVZw/playlists?view=1&sort=lad&flow=grid

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

@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

This topic is closed to new replies.

Advertisement