在XNA中对网格进行排序

我在XNA中遇到树问题。 当我有树时,我需要使用alpha混合来使非叶部分透明,但模型的某些部分未正确显示,因此alpha混合失败。 我想知道是否有可能读取网格位置来对它们进行排序,或者是否有其他方法可以获得透明的非叶子部分。 模型中的排序可能不起作用,因为我想从各个角度看这棵树。

在3D环境中进行Alpha混合可能是一个棘手的问题。 Shawn Hargreaves几年前撰写了一篇文章 ,涉及大多数主要问题(标题为Painter算法的部分专门处理您的问题)。 长话短说:没有任何技术可以完美地完成你想做的事情,所以问题就变成了:你愿意做出哪些权衡取舍?

进行alpha测试而不是alpha混合可能是最简单的解决方案。 这是一个二元测试,其中出现或不出现不透明像素,因此绘制这些像素的顺序在很大程度上是无关紧要的。 这将为您提供坚硬的边缘,但如果您的纹理具有足够的分辨率,它仍然可以看起来很好; 我知道魔兽世界使用这种技术,我很确定我记得在暗黑破坏神III中看过它。

您可以使用内置的AlphaTestEffect来执行此操作,或者在像素着色器中AlphaTestEffect实现它。

您正在寻找的是称为顺序无关透明度,这可以使用称为“ 深度剥离 ”的方法来实现。 如果您没有使用XNA的Reach配置文件并且可以编写自定义着色器 – 您可以实现此技术以实现正确的混合,而无需担心网格级别信息或必须为当前帧/视图重新排序它们。

这是另外一个DX9(但很容易适应XNA)实现。