XNA中3D模型的绘制顺序

3
我在XNA中绘制3D模型时遇到了问题,无法正确排序。以下是两张图片描述了问题:
图片1:http://imgur.com/wGPIk&L5AY1l 图片2:http://imgur.com/wGPIkl&L5AY1 球正在向下移动,一旦与地形相交,透视图会发生变化,看起来就像球在地形后面一样。
如果我改变绘制顺序,它将始终显示球在地形上方。
请问有人能解释如何解决这个问题吗?
提前感谢。
2个回答

10
问题出在绘制角落的FPS计数器的SpriteBatch调用上。
SpriteBatch会改变图形设备的状态。每当你完成2D对象的绘制(在这种情况下,是左上角的帧率计数器),你需要恢复设备状态。
在调用 "SpriteBatch.End()" 后,添加以下代码:
device.DepthStencilState = DepthStencilState.Default;

其中device是指你正在绘制的当前GraphicsDevice的引用。


@dsk 我曾经花了几天时间追踪同样的问题。你可以采纳我的答案吗?我喜欢得分! - 3Dave
太棒了,这终于解释了为什么我的模型看起来像垃圾! - Kaleb Brasee

1

这看起来像是一个ZBuffer问题。你检查过你的Zbuffer是否启用并且正常工作了吗?试试David Lively说的方法。如果那行得通,再检查一下你是否在SpriteBatch类的BeginEnd调用之间绘制了你的3D模型。 Begin准备设备以绘制2D对象,如果你现在尝试调用3D绘图,这是不可能的。End确保所有为2D设置的状态都被取消,并恢复到Begin调用之前的状态。


当我最初遇到这个问题时,我也认为它是一个z-buffer问题。(从技术上讲,确实是)。+1,但SpriteBatch并没有恢复整个图形状态。这是权衡方便与功能的其中之一。 - 3Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接