Jump to content
  • Advertisement
Sign in to follow this  
dgreen02

Shadow map alpha testing question [SOLVED].

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

Hey guys...I've recently implemented realtime shadow maps into my game "Gang War", it's coming along very nicely, I'm just about done with 'em. I'm rendering 2 shadow maps every frame, a global shadow map that covers the entire city, and a local shadow map that is focused on the camera, and I blend between the two. Here are 2 videos showing how it looks in-game (you'll need DivX to watch these).... Anyways...I'm implementing alpha testing for fences, trees, etc. It doesn't seem to work. I was under the impression that shadow maps could easily support alpha testing in the shadows...ie: when rendering the scene from the light's perspective, just don't render texels that fail the alpha test. Though it doesn't seem to work. I've tried rendering the shadow map overlayed on screen and all parts that should fail the alpha test, and not be rendered, appear black (and cast a shadow). I'm explicitly enabling alpha testing right before rendering to the shadow maps, and setting the ALPHA_REF as well. Alpha testing works fine in every other part of the scene, though it doesn't seem to work for the shadow maps, here is another screenshot showing the problem....the shadow of the fence isn't alpha tested :-/ Is there something I'm missing? Is there a special way to use alpha testing when rendering shadow maps? I'd appreciate any help/advice you guys might have to offer. - Dan [Edited by - dgreen02 on December 10, 2005 3:44:03 AM]

Share this post


Link to post
Share on other sites
Advertisement
It should work, assuming you still set the texture containing the alpha, and setup your colorop/alphaop (remember a stage must have both a color and alphaop, or both be set to disable, in order to be valid) or pixel shader to fetch from the texture. I've done nVidia style shadow maps (ie: use depth buffer as a texture on ps.1.1 hardware) with alphatest and it worked as expected. Also, make sure you're not trying to over optimize your shadow geometry by stripping out UVs.

Share this post


Link to post
Share on other sites
Hmmm....Yup, I'm fairly sure I'm doing all that stuff correctly.

Here is another screenshot, this is the what the shadow map looks like when I sample the texture, instead of just outputting the depth in the shadow map pixel shader....and then display it...the shadow map is of D3DFMT_R32F format.

The circled areas are the problematic parts...I'm using alpha tested imposters for distant street lights, and the fence doesn't appear correct either :-/

Share this post


Link to post
Share on other sites
Anybody have any ideas? I'm still looking for a solution to this problem. Any suggestions would be appreciated!

The alpha testing happens after the pixel is sent from the shader, and before it's written to the surface, so the fact that I'm rendering to texture with a single channel shouldn't have anything to do with it, correct?

- Dan

Share this post


Link to post
Share on other sites
It's getting a bit late and my brain is starting to turn off... but I'm sure I've read about this before [oh]

Something to do with alpha testing still filling the depth buffer and only discarding the colour write.

Provided I am correct... If I can find a source for that or remember the details I'll get back to you [smile]

Jack

Share this post


Link to post
Share on other sites
Guest Anonymous Poster
Hi dgreen02,
your game look cool ! :)

Recent video cards does not support alpha testing with float rendertarget formats !
If your shadowmap is D3DFMT_R32F you must emulate alpha-testing manually
by killing pixels using texkill instruction.

Petr S.

Share this post


Link to post
Share on other sites
[EDIT: Oops, too slow!]
It is becuase alpha testing is not RT dependent, and most current GFX cards supporting FP render targets do not support post pixel shader blending operations (which includes alpha testing) when using them. I think there is either a cap to check for support or you can use CheckDeviceFormat or similar I think...

It's a real pain in the ass!

You can use texkill\clip() in your pixel shader though. One possibility is to render all opaque casters separately in a few large drawPrimitive calls (as you don't need their material info) and then render all alpha-testing casters with a pixel shader using texkill. This may get you some speed optimisations on some cards that take a different internal path if the pixel shader uses texkill.

Hope this helps,

Mike.

Share this post


Link to post
Share on other sites
I know, it is a bit off-topic (that is, not answering your question), but would you mind to explain your two shadow maps system a bit? I'm very curious! Thanks!

Share this post


Link to post
Share on other sites
That FP render targets thing sounds similar to what I was trying to remember earlier. The closest I could remember before reading that was that you had to emulate it using texkill/clip()...!

Quote:
Original post by roel
I know, it is a bit off-topic (that is, not answering your question), but would you mind to explain your two shadow maps system a bit? I'm very curious! Thanks!

Check out his developer journal - it's without a doubt one of the better ones. I forget when exactly, but he's talked about the various bits of technology used in his game/engine [smile]

cheers,
Jack

Share this post


Link to post
Share on other sites
Great...I appreciate the help guys! I'm sure I'll be able to get it working now.

roel - I'll also be posting some info in my developers journal, as well as some videos showing the all the new stuff, sometime today, so check it out if you're interested :-D

Thanks again for your help guys.

- Dan

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!