为此搜索了很多,请阅读this very useful article,但仍然想知道我的项目的解决方案。这个截图完美地说明了我的问题:
有两个对象:红色对象由2个四边形组成,一个z-index为-1,另一个z-index为1.两个四边形都有Color.Red * 0.5f
。首先绘制。另一个对象是z-index为0的玩家。获取第二个
因为我希望玩家在四边形之间移动,所以我将DepthStencilState
设置为DepthStencilState.Default;
,但这会提供以下图像。玩家的像素被忽略,因为前面有一个物体。
我基于this class将所有原语批量分成一个大的DrawUserPrimitive。这个问题的最佳解决方案是什么?我是否必须根据z-index对三角形进行排序(我将如何做到这一点;它是否昂贵?)还是有另一种解决方案?
答案 0 :(得分:3)
你只需完全按照that article所说的去做。以下列出了“最常用的方法”,针对XNA 4进行了更新:
GraphicsDevice.DepthStencilState = DepthStencilState.Default
GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead
如果您的透明对象或多或少凸起,那么只要您使用RasterizerState.CullCounterClockwise
(即:背面剔除,默认值),您就不需要对三角形进行排序 - 只需对象本身。
你必须这样做的原因是深度缓冲区只能存储一个值 - 这是最顶层像素的值。没有“深入”这个深度的概念。这样做所需的数据(在该像素上Z-index上方和下方绘制的对象的颜色)已经被混合到最终图像中,无法提取。