0

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

在渲染模型之前:

global.GraphicsDevice.DepthStencilState = DepthStencilState.Default;

更早的地方:

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

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

结果是这样的:

渲染场景

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

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

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

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

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

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

1 回答 1

3

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

RenderTarget2D 默认禁用其 DepthBuffer。

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

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

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

于 2013-06-10T23:50:01.700 回答