4

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

4

2 回答 2

1

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

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

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

于 2012-12-18T18:53:42.530 回答
0

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

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

于 2012-12-18T19:33:20.580 回答