【问题标题】:Drawing a 2D HUD messes up rendering of my 3D models?绘制 2D HUD 会破坏 3D 模型的渲染?
【发布时间】:2013-02-18 14:41:22
【问题描述】:

我正在使用 XNA 3.1

我最近通过在我的游戏中使用Components.Add(myComponent) 创建了一个 2D 平视显示器 (HUD)。 HUD 看起来不错,显示 2D 地图、十字准线和帧率计数器。问题是,只要 HUD 在屏幕上,游戏中的 3D 对象就不再正确绘制。

离我的玩家更远的东西可能会在更近的东西之后被绘制,当我走过模型时,模型有时会失去定义。当我移除 HUD 时,一切都正常绘制。

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

这就是没有GameComponent 的样子:

下面是 GameComponent 的样子(在这种情况下,它只是左上角屏幕外显示帧率的一些文本),注意后面的树是如何出现在靠近相机的树前面的:

【问题讨论】:

  • 在 HUD 渲染代码中的某个地方,管道状态发生了变化,之后不会恢复。确保在绘制模型时设置了所有必要的状态。这包括混合/光栅化器/深度模板状态、视口、着色器、采样器、输入布局、深度缓冲区和渲染目标。您能否提供一个屏幕截图来缩小问题范围?
  • 感谢您的回复。下班后我会提供截图。
  • 在绘制模型之前尝试GraphicsDevice.DepthStencilState = DepthStencilState.Default;
  • GraphicsDevice.RenderState.DepthBufferEnable = trueGraphicsDevice.RenderState.DepthBufferWriteEnable = true 是 XNA 3.1 的等效项。
  • 是的,SpriteBatch.Begin 禁用深度缓冲区,因此您必须为每一帧重新启用它。很高兴我能帮助你!我明天会发布一个答案,这样就可以结束了。

标签: xna


【解决方案1】:

您必须启用深度缓冲区:

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

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

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

在这两个版本中,深度缓冲都被禁用,这就是导致问题的原因。

再次强调,我怎么强调都不过分:

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

  • 混合状态
  • DepthStencilState
  • 光栅化状态
  • 视口
  • 渲染目标
  • 着色器
  • 采样器状态
  • 纹理
  • 常量

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 2017-08-05
    • 2013-03-25
    相关资源
    最近更新 更多