XNA / MonoGame:深度排序alpha混合UserPrimitives

时间:2013-03-06 11:43:51

标签: xna primitive alphablending depth monogame

为此搜索了很多,请阅读this very useful article,但仍然想知道我的项目的解决方案。这个截图完美地说明了我的问题:

Alpha Blend Problem

有两个对象:红色对象由2个四边形组成,一个z-index为-1,另一个z-index为1.两个四边形都有Color.Red * 0.5f。首先绘制。另一个对象是z-index为0的玩家。获取第二个

因为我希望玩家在四边形之间移动,所以我将DepthStencilState设置为DepthStencilState.Default;,但这会提供以下图像。玩家的像素被忽略,因为前面有一个物体。

我基于this class将所有原语批量分成一个大的DrawUserPrimitive。这个问题的最佳解决方案是什么?我是否必须根据z-index对三角形进行排序(我将如何做到这一点;它是否昂贵?)还是有另一种解决方案?

1 个答案:

答案 0 :(得分:3)

你只需完全按照that article所说的去做。以下列出了“最常用的方法”,针对XNA 4进行了更新:

  1. 设置GraphicsDevice.DepthStencilState = DepthStencilState.Default
  2. 绘制所有不透明几何体
  3. 设置GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead
  4. 按照距离相机的距离对alpha混合对象进行排序,然后按照从后到前的顺序绘制它们
  5. 如果您的透明对象或多或少凸起,那么只要您使用RasterizerState.CullCounterClockwise(即:背面剔除,默认值),您就不需要对三角形进行排序 - 只需对象本身。

    你必须这样做的原因是深度缓冲区只能存储一个值 - 这是最顶层像素的值。没有“深入”这个深度的概念。这样做所需的数据(在该像素上Z-index上方和下方绘制的对象的颜色)已经被混合到最终图像中,无法提取。