Take the 2-minute tour ×
Game Development Stack Exchange is a question and answer site for professional and independent game developers. It's 100% free, no registration required.

In XNA 3.1 is there any other way to disable depth in 3D Worlds using DirectX models other than

GraphicsDevice.RenderState.DepthBufferEnable = false;

?

The reason for my question is I have quite a huge program which offers a 3D World with a couple of 3D DirectX models inside. Depth was never an issue since it ever worked fine but since a few days after doing some modifications my models are all depth-translucent i.e. depth-buffering and/or culling seems to be disabled.

But in my whole source code I never touch any of the options related to Depth or Culling which means I never turn these settings on explicitly nor turn it off somewhere.

So I am searching for some other statement maybe related to the GraphicsDevice that implicitly turns depth off - but I can't find it.

(Sorry that I don't post any source code but I have too much source code and I simply don't know where to search)

UPDATE:

These are a couple of simple objects seen with correct depth. These are a couple of simple objects seen with correct depth.

These are the same objects in their current state. These are the same objects in their current state.

share|improve this question
1  
Well, first, are you aware that the Z buffer doesn't work for transparent polygons? The bottom line is that since you now have depth-translucent objects, this becomes a depth-sorting issue. –  Laurent Couvidou Oct 31 '12 at 13:56
1  
You should probably post a picture. And my hunch is your culling order got reversed, try flipping that to eliminate the possibility. –  KlashnikovKid Oct 31 '12 at 14:03
    
@LaurentCouvidou My model has indeed transparent parts but I have transparency disabled in XNA (by not enabling it explicitly) so that these parts appear opaque. –  marc wellman Oct 31 '12 at 14:03
    
@KlashnikovKid preparing picture, hold on ... –  marc wellman Oct 31 '12 at 14:04
    
@KlashnikovKid Images added ... –  marc wellman Oct 31 '12 at 14:18

3 Answers 3

up vote 5 down vote accepted

It does look like the spritebatch overlay drawing is changing your cullmode renderstate setting.

In 3.1 you can tell the spritebatch to save and restore the renderstate with the SaveStateMode parameter;

SpriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.SaveState);

From MSDN;

However, there are cases where render states can change automatically. A common example is the rendering of sprites and 3D objects on the same graphics device. In this case, the SpriteBatch object changes various render states when you call End. If you try any 3D rendering after this step, the results can be unpredictable.

For this reason, you should restore several key render states to their former settings before you try to render any 3D objects. The following code demonstrates this approach.

    GraphicsDevice.RenderState.DepthBufferEnable = true;
    GraphicsDevice.RenderState.AlphaBlendEnable = false;
    GraphicsDevice.RenderState.AlphaTestEnable = false;

More from MSDN

SpriteBatch.Begin sets the following render states.

  • CullMode
  • DepthBufferEnable
  • AlphaBlendEnable
  • AlphaTestEnable

  • AlphaBlendOperation

  • SourceBlend
  • DestinationBlend
  • SeparateAlphaBlendEnabled
  • AlphaFunction
  • ReferenceAlpha

Begin sets the following sampler states.

  • AddressU
  • AddressV
  • MagFilter
  • MinFilter
  • MipFilter
  • MipMapLevelOfDetailBias
  • MaxMipLevel

If Begin is called with SaveStateMode set to None, then these states must be reset by the caller if they are used elsewhere. Calling Begin with SaveStateMode set to SaveState will reset these values properly, but may adversely affect performance.

share|improve this answer
    
I removed every single call to the Spritebatch.Begin() method (of which I had many) BUT unfortunately nothing has changed: I still have no depth in my model. –  marc wellman Oct 31 '12 at 22:41
    
Please see my answer below. Nevertheless i marked your answer as correct because it gave some valuable insight into these things that helped me lot. Thank you for that! –  marc wellman Oct 31 '12 at 23:42
    
Just going by your screenshots it looks definitely like a culling issue. Are you usuing primitive to draw the boxes. Did you by any chance change the order in your vertex lists? –  Ken Nov 1 '12 at 8:41
    
The boxes are DirectX models which are drawn in the very standard way as it should be done in XNA (loading Model from Content; iteration over all modelMeshes; iteration over all effects per mesh; setting worldCoordinates, projection and view; and drawing each mesh) ... Nevertheless I did find the faulty statement which was the cause for my trouble -> see my answer below. And again thank you for your comment - you did help me a lot ! –  marc wellman Nov 1 '12 at 9:49

Are you using a SpriteBatch to render your overlay in the second image? If so, SpriteBatch in 3.1 sets render states when drawing (including disabling the depth buffer) that you need to restore before drawing in 3D. See this article for the exact states changed.

share|improve this answer
    
I removed every single call to the Spritebatch.Begin() method (of which I had many) BUT unfortunately nothing has changed: I still have no depth in my model. –  marc wellman Oct 31 '12 at 22:48
    
Thank you very much for your comment. –  marc wellman Oct 31 '12 at 23:43

Thank you for all the comments and efforts.

After having cut my whole program into pieces I found the error which was in fact a silly one. For some reason I set the depth of my main viewport I am using to render the models to

_mainViewport.MaxDepth = 2.0f;

which was the cause why my models showed no depth!

After setting the MaxDepth value to 1.0f my models were displayed correctly again.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.