【问题标题】:Depth Buffer not working深度缓冲区不起作用
【发布时间】:2013-06-09 04:28:48
【问题描述】:

在我的 XNA 3D 游戏中,出于某种原因,深度缓冲区已关闭并被忽略 - 尽管我已经尽我所能来启用它(诚然,这并不多,但它应该很简单.. . 更不用说默认了)

在渲染模型之前:

global.GraphicsDevice.DepthStencilState = DepthStencilState.Default;

之前的某个地方:

graphics.PreferredDepthStencilFormat = DepthFormat.Depth24Stencil8;
graphics.ApplyChanges();

使用带有 device.DrawUserIndexedPrimitives 和 BasicEffect 的 Vertex/Index 列表渲染模型。

结果是这样的:

紫色物体离相机很远,第一个被绘制出来。

灰色物体非常靠近相机,第二次绘制。

蓝色物体距离相机中等距离,被绘制在第三个位置。

灰色对象正在渲染蓝色对象的后面 - 如果您要离开绘制顺序,这是正确的,但我希望它按与相机的距离进行组织(使用深度缓冲区) ,在这种情况下,灰色对象应绘制在蓝色对象的前面。

(而且,不,只是手动快速排序,虽然它可能提供临时解决方案,但不是解决此问题的方法)

  • 更新:这与我渲染到 RenderTarget2D 而不是直接渲染到屏幕上的事实直接相关。 (如果我在屏幕上渲染而不是渲染目标,则深度计算正确。程序的其他部分需要渲染目标......或等效系统。)

【问题讨论】:

  • 您确定物体在您期望的距离吗?您可以通过更改抽奖顺序来检查这一点。
  • 您确定在绘制 3d 对象之前设置了 DepthStencilState 并且没有其他更改它(如 spritebtach 调用)?
  • @Nico - 绝对积极。 -布劳 - 是的。唯一介于两者之间的是 global.GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise;并应用基本效果。
  • @Blau (无法在第一条评论中链接您,所以现在链接...) -Nico - 更改抽签顺序会更改它们在其中可见的顺序...并且它们肯定在我在 OP 中列出的距离。
  • 如果你禁用 DepthStencilState 结果会改变吗?也许现在的结果是对的……有时我意识到这是观点,或者我的想法对预期的结果有误

标签: c# xna xna-4.0


【解决方案1】:

好吧,我在随机搜索后自己找到了我错过的东西:

RenderTarget2D 默认禁用其 DepthBuffer。

我只需要在我正在绘制的渲染目标上设置 DepthFormat。

知道我错过了一些明显的东西......

(如果网站允许,我会在 4 小时内勾选绿色复选标记。) ED:也就是说,除非在那个时候,有人发布了一个可以/应该设置 XNA 深度缓冲区数据的好列表,以更好地帮助可能通过 google 找到该主题的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    相关资源
    最近更新 更多