2013-02-18 62 views
1

我正在使用XNA 3.1绘制2D HUD会渲染我的3D模型?

我最近使用Components.Add(myComponent)在我的游戏中创建了2D平视显示器(HUD)。 HUD看起来很好,显示了2D地图,十字线和帧率计数器。事情是,每当HUD出现在屏幕上时,游戏中的3D对象都不再正确绘制。

离我的玩家更远的东西可能会在距离更近的地方得到,当我走过它们时,模型有时会失去定义。当我移除HUD时,所有绘制都正常。

是否有任何已知的问题需要注意?我应该如何在3D游戏区域绘制2D HUD?

这是它看起来就像没有GameComponent

two 3D objects, the one further away is correctly rendered behind the closer one

这里是它的外观与GameComponent(在这种情况下,它只是一些文字离屏幕的左上角,显示帧率)注意到后面的树是如何出现在树前更接近摄像机:

two 3D objects, the one further away is rendered on top of the closer one

+1

HUD渲染代码中的某处会更改流水线状态,以后不会恢复。确保绘制模型时设置*所有必要的状态*。这包括混合/光栅化器/深度模板状态,视口,着色器,采样器,输入布局,深度缓冲区和渲染目标。你能提供一个截图来缩小问题的范围吗? – Lucius 2013-02-18 15:00:44

+0

感谢您的回复。我一回到工作岗位就会提供屏幕截图。 – PaulG 2013-02-18 15:10:07

+0

在绘制模型之前,尝试'GraphicsDevice.DepthStencilState = DepthStencilState.Default;'。 – Lucius 2013-02-19 00:39:39

回答

1

您必须启用深度缓冲区:

// XNA 3.1 
GraphicsDevice.RenderState.DepthBufferEnable = true; 
GraphicsDevice.RenderState.DepthBufferWriteEnable = true; 

// XNA 4.0 
GraphicsDevice.DepthStencilState = DepthStencilState.Default; 

SpriteBatch.Begin改变图形流水线的状态:

在这两个版本的深度缓冲被禁止,这是什么原因造成的问题。

同样,我不能强调这一点:

务必确保所有渲染状态绘制任何几何体之前设置正确。

  • BlendState
  • DepthStencilState
  • RasterizerState
  • 视口
  • RenderTargets
  • 着色
  • SamplerStates
  • 纹理
  • 常量

教育自己在purpose of each state和渲染管道中的每个阶段。如果有疑问,请尝试将所有内容重置为默认值。