• Announcements

    • khawk

      Download the Game Design and Indie Game Marketing Freebook   07/19/17

      GameDev.net and CRC Press have teamed up to bring a free ebook of content curated from top titles published by CRC Press. The freebook, Practices of Game Design & Indie Game Marketing, includes chapters from The Art of Game Design: A Book of Lenses, A Practical Guide to Indie Game Marketing, and An Architectural Approach to Level Design. The GameDev.net FreeBook is relevant to game designers, developers, and those interested in learning more about the challenges in game development. We know game development can be a tough discipline and business, so we picked several chapters from CRC Press titles that we thought would be of interest to you, the GameDev.net audience, in your journey to design, develop, and market your next game. The free ebook is available through CRC Press by clicking here. The Curated Books The Art of Game Design: A Book of Lenses, Second Edition, by Jesse Schell Presents 100+ sets of questions, or different lenses, for viewing a game’s design, encompassing diverse fields such as psychology, architecture, music, film, software engineering, theme park design, mathematics, anthropology, and more. Written by one of the world's top game designers, this book describes the deepest and most fundamental principles of game design, demonstrating how tactics used in board, card, and athletic games also work in video games. It provides practical instruction on creating world-class games that will be played again and again. View it here. A Practical Guide to Indie Game Marketing, by Joel Dreskin Marketing is an essential but too frequently overlooked or minimized component of the release plan for indie games. A Practical Guide to Indie Game Marketing provides you with the tools needed to build visibility and sell your indie games. With special focus on those developers with small budgets and limited staff and resources, this book is packed with tangible recommendations and techniques that you can put to use immediately. As a seasoned professional of the indie game arena, author Joel Dreskin gives you insight into practical, real-world experiences of marketing numerous successful games and also provides stories of the failures. View it here. An Architectural Approach to Level Design This is one of the first books to integrate architectural and spatial design theory with the field of level design. The book presents architectural techniques and theories for level designers to use in their own work. It connects architecture and level design in different ways that address the practical elements of how designers construct space and the experiential elements of how and why humans interact with this space. Throughout the text, readers learn skills for spatial layout, evoking emotion through gamespaces, and creating better levels through architectural theory. View it here. Learn more and download the ebook by clicking here. Did you know? GameDev.net and CRC Press also recently teamed up to bring GDNet+ Members up to a 20% discount on all CRC Press books. Learn more about this and other benefits here.
Sign in to follow this  
Followers 0
Fabonymous

Depth-testing in the fragment shader

10 posts in this topic

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.

[CODE]
float fragDepth = gl_FragCoord.z;
float textDepth = texture2D( depth_texture, gl_FragCoord.xy ).r;
[/CODE]

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

[CODE]float depthDiff = textDepth - fragDepth;
float threshold = 0.005;

if( depthDiff > threshold )
{
discard;
}[/CODE]

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

Share this post


Link to post
Share on other sites
[quote name='mhagain' timestamp='1335829729' post='4936231']
Any reason not to just use standard depth testing? It will run better and give you more predictable results.
[/quote]

With standard depth testing, [i]glDepthFunc(GLenum func)[/i], 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 [i]Depth Testing[/i] pipeline stage. Maybe it is possible with running multiple passes or an extension, I don't know. That's why I'm asking :-)
0

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
0

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
0

Share this post


Link to post
Share on other sites
[quote name='L. Spiro' timestamp='1335950345' post='4936702']
Is there a reason why ::glPolygonOffset() will not work? It works for standard decals. Are yours not standard?


L. Spiro
[/quote]

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

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
0

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

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

Share this post


Link to post
Share on other sites
[quote name='Fabonymous' timestamp='1336046430' post='4937064']
@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?
[/quote]

DICE has a [url="http://publications.dice.se/attachments/GDC09_ShadowAndDecals_Frostbite.ppt"]presentation[/url]. It's complicated. You may not want to give up on projected decals so easily...games have shipped with it. [img]http://public.gamedev.net//public/style_emoticons/default/smile.png[/img]
0

Share this post


Link to post
Share on other sites
@[url="http://www.gamedev.net/user/198131-fabonymous/"]Fabonymous[/url]

Late to the party but in case you or someone else happens to this:

[quote]
float textDepth = texture2D( depth_texture, gl_FragCoord.xy ).r;
[/quote]

This is not going to give you the depth value you expect. gl_FragCoord gives you screen coordinates (screenWidth, screenHeight), so depending on your screen resolution the values change dramatically. For instance at 800x600 gl_FragCoord will give you something in the range of (0-800, 0-600).

You want your texture coordinates to be between 0-1 when sampling the depth texture. So what you need to do is convert gl_FragCoord (screen coords) to something usable. To do that, you simply divide by the screenWidth and screenHeight.

[CODE]
// Samples wrong location in the texture
//float textDepth = texture2D( depth_texture, gl_FragCoord.xy ).r;
// First translate the screen coordinates to texture coordinates
vec2 texCoords = vec2(gl_FragCoord.x / screenWidth, gl_FragCoord.y / screenHeight);
// Now sample the depth
float textDepth = texture2D( depth_texture, texCoords);
[/CODE]

If you know the screenWidth and screenHeight are always the same, you can just hard code in the values. Otherwise, you can pass them to your shader using Uniforms
0

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  
Followers 0