为此进行了很多谷歌搜索,阅读 this very useful article ,但仍然想知道我的项目的解决方案。此屏幕截图完美地说明了我的问题:
有 2 个对象:红色对象由 2 个四边形组成,一个 z 索引为 -1,另一个 z 索引为 1。两个四边形都有 Color.Red * 0.5f
。首先被抽中。另一个对象是 z-index 为 0 的玩家。第二个被绘制
因为我希望玩家在四边形之间移动,所以我将 DepthStencilState
设置为 DepthStencilState.Default;
但这提供了以下图像。玩家的像素会被忽略,因为它前面有一个物体。
我将所有基元批处理为一个基于 this class 的大 DrawUserPrimitive 。这个问题的最佳解决方案是什么?我是否必须根据 z-index 对三角形进行排序(以及如何做到这一点;昂贵吗?)还是有其他解决方案?
最佳答案
您只需要做 that article 即可说。以下是列为“最常见方法”的说明,针对 XNA 4 进行了更新:
- 设置
GraphicsDevice.DepthStencilState = DepthStencilState.Default
- 绘制所有不透明几何图形
- 设置
GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead
- 按距相机的距离对 Alpha 混合对象进行排序,然后按从后到前的顺序绘制它们
如果您的透明对象或多或少是凸的,那么您不需要对三角形进行排序 - 只需对对象本身进行排序 - 只要您使用 RasterizerState.CullCounterClockwise
(即:背面剔除,默认)。
您必须这样做的原因是深度缓冲区只能存储单个值 - 即最上面像素的值。不存在在该深度“之下”绘制的概念。执行此操作所需的数据(在该像素处的 Z 索引上方和下方绘制的对象的颜色)已混合到最终图像中,无法提取。
关于XNA/MonoGame : depth sorting alpha blended UserPrimitives,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15246460/