XNA/MonoGame : depth sorting alpha blended UserPrimitives

标签 xna primitive alphablending depth monogame

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

Alpha Blend Problem

有 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 进行了更新:

  1. 设置GraphicsDevice.DepthStencilState = DepthStencilState.Default
  2. 绘制所有不透明几何图形
  3. 设置GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead
  4. 按距相机的距离对 Alpha 混合对象进行排序,然后按从后到前的顺序绘制它们

如果您的透明对象或多或少是凸的,那么您不需要对三角形进行排序 - 只需对对象本身进行排序 - 只要您使用 RasterizerState.CullCounterClockwise (即:背面剔除,默认)。

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

关于XNA/MonoGame : depth sorting alpha blended UserPrimitives,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15246460/

相关文章:

java - java中的第三个 boolean 状态是什么?

iPhone opengl es alpha 混合。我的边缘是黑色的

SVG:防止相邻多边形之间的透明间隙

OpenGL 透明度/半透明

input - 如何从 Xbox 360 Controller 获取输入?

c# - XNA 3D 程序的正确 OOP 设计是什么?

c# - XNA Content.Load() 内存使用

c# - XNA 3.1 项目无法在 Windows 8 中构建

java - 整数集。在增加新条目的情况下可能会提高性能

objective-c - 在 Objective-C 中处理整数