XNA/MonoGame:深度排序alpha混合用户原语

XNA/MonoGame:深度排序alpha混合用户原语,xna,primitive,alphablending,depth,monogame,Xna,Primitive,Alphablending,Depth,Monogame,为此,谷歌搜索了很多,阅读,但仍然想知道我的项目的解决方案。此屏幕截图完美地说明了我的问题: 有两个对象:红色对象由两个四边形组成,一个z索引为-1,另一个z索引为1。两个四边形都有Color.Red*0.5f。先画。另一个对象是z索引为0的玩家。倒数第二 因为我想让播放器在四边形之间移动,所以我将DepthStencilState设置为DepthStencilState.Default但这提供了以下图像。玩家的像素被忽略,因为它前面有一个物体 我将所有原语批处理为一个基于的大型DrawUse

为此,谷歌搜索了很多,阅读,但仍然想知道我的项目的解决方案。此屏幕截图完美地说明了我的问题:

有两个对象:红色对象由两个四边形组成,一个z索引为-1,另一个z索引为1。两个四边形都有
Color.Red*0.5f
。先画。另一个对象是z索引为0的玩家。倒数第二

因为我想让播放器在四边形之间移动,所以我将
DepthStencilState
设置为
DepthStencilState.Default但这提供了以下图像。玩家的像素被忽略,因为它前面有一个物体


我将所有原语批处理为一个基于的大型DrawUserPrimitive。这个问题的最佳解决方案是什么?我是否必须根据z索引对三角形进行排序(我将如何进行排序;它是否昂贵?)或者是否有其他解决方案?

您只需按照上面所说的做即可。以下是针对XNA 4更新的“最常用方法”说明:

  • 设置
    GraphicsDevice.DepthStencilState=DepthStencilState.Default
  • 绘制所有不透明的几何图形
  • 设置
    GraphicsDevice.DepthStencilState=DepthStencilState.DepthRead
  • 按距离摄影机的距离对alpha混合对象进行排序,然后按从后到前的顺序绘制它们
  • 如果透明对象或多或少是凸面的,则无需对三角形进行排序—只需对对象本身进行排序—只要使用
    光栅化状态.culls逆时针
    (即:背面消隐,默认设置)


    您必须这样做的原因是深度缓冲区只能存储一个值,即最顶层像素的值。在这种深度下没有绘画的概念。执行此操作所需的数据(在该像素处,Z索引上方和下方绘制的对象的颜色)已混合到最终图像中,无法提取。

    谢谢!所以我想我必须对这些物体进行分类。它们确实或多或少是凸面的,尽管我认为使用剔除不会有帮助,因为我的形状太基本,由太少的三角形组成,而且99%的时间这些三角形只是部分可见。我将进行排序,我仍然需要找出如何进行排序(例如,将红色对象分解为2),但我会处理。欢迎提供任何提示或文章!即使对于单个半透明模型(因此:独立于排序或Z缓冲区),也需要执行背面剔除以获得正确的渲染结果。如果没有,则可以在前面的顶部绘制背面(取决于三角形顺序和相机方向)。当然-这将只绘制模型的正面,因此如果希望正面和背面都可见(这将使其看起来更像空心对象而不是实心对象),则必须在两个过程中进行渲染(正面消隐,然后背面消隐)。(需要明确的是,背面剔除要求适用于3D凸面形状,如立方体或球体。而不是四边形(在屏幕截图中很难判断渲染的是什么)。基本上,这是一种基于每个模型对三角形进行排序的廉价方法,而无需实际排序。)