2012-12-18 51 views
4

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

回答

1

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

做alpha测试而不是alpha混合可能是最简单的解决方案。这是一个二元测试,其中一个不透明像素出现或不出现,所以这些像素的绘制顺序在很大程度上是不相关的。这会给你带来很大的优势,但如果你的纹理有足够的分辨率,它仍然可以看起来不错。我知道魔兽世界使用这种技术,并且我很确定我记得在暗黑破坏神III中看到它。

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

+0

不 - 有一种技术可以做他想做的事。 – Ani

+0

我没有说没有任何技术可以做他想做的事。例如,对每个三角形进行单独排序是一种非常简单的技术,可以满足他的要求。我说没有完美的技术,深度剥离也是如此。它需要你使用HiDef配置文件,它需要你编写复杂的着色器,它需要额外的几何通行证,可能或不可以接受......只有图恩可以回答什么技术适合他的需求的问题。我建议了其中之一。 –

+0

这种排序是在碎片级别完成的,所以它给出了足够的通行证实际上会产生像素完美结果。对性能和质量进行微调也很容易。虽然你说得很对,但它很复杂,需要多次通过。 – Ani

0

您要查找的内容称为订单独立透明度,可以使用名为“Depth peeling”的方法实现。如果您没有使用XNA的Reach配置文件并且可以编写自定义着色器 - 您可以实现此技术以实现正确的混合,而无需担心网格级信息或必须对当前帧/视图重新排序。

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