【发布时间】: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 结果会改变吗?也许现在的结果是对的……有时我意识到这是观点,或者我的想法对预期的结果有误