【发布时间】:2012-12-19 03:33:20
【问题描述】:
我对 XNA 中的树有疑问。当我有树时,我需要使用 alpha 混合使非叶子部分透明,但是模型的某些部分没有正确显示,因此 alpha 混合失败。我想知道是否有可能读取网格位置来对它们进行排序,或者是否有任何其他方法可以获得透明的非叶子部分。 在模型中排序可能不起作用,因为我想从各个角度看这棵树。
【问题讨论】:
标签: c# xna xna-4.0 mesh alphablending
我对 XNA 中的树有疑问。当我有树时,我需要使用 alpha 混合使非叶子部分透明,但是模型的某些部分没有正确显示,因此 alpha 混合失败。我想知道是否有可能读取网格位置来对它们进行排序,或者是否有任何其他方法可以获得透明的非叶子部分。 在模型中排序可能不起作用,因为我想从各个角度看这棵树。
【问题讨论】:
标签: c# xna xna-4.0 mesh alphablending
3D 环境中的 Alpha 混合可能是一个棘手的问题。肖恩·哈格里夫斯(Shawn Hargreaves)几年前写了一封article,涉及大部分主要问题(标题为画家算法的部分专门处理您的问题)。长话短说:没有技术可以完美地做你想做的事,所以问题就变成了:你愿意做出什么取舍?
进行 Alpha 测试而不是 Alpha 混合可能是最简单的解决方案。这是一个二元测试,其中一个不透明的像素要么出现要么不出现,因此绘制这些像素的顺序在很大程度上是无关紧要的。这会给你带来坚硬的边缘,但如果你的纹理有足够的分辨率,它仍然看起来不错;我知道魔兽世界使用了这种技术,而且我很确定我记得在暗黑破坏神 III 中看到过它。
您可以使用内置的AlphaTestEffect 来执行此操作,或者在像素着色器中自行实现。
【讨论】:
AlphaTestEffect 的工作方式。特别是,ReferenceAlpha 属性用于确定失败/通过阈值。将它设置为 1 应该会给你一个干净的优势,但它仍然可能看起来不太正确。您需要重新制作叶子纹理,以考虑到您没有任何部分透明度。
您要查找的内容称为订单独立透明度,这可以使用称为“Depth peeling”的方法来实现。如果您不使用 XNA 的 Reach 配置文件并且可以编写自定义着色器 - 您可以实施此技术来实现正确的混合,而无需担心网格级别信息或不必为当前帧/视图重新排序。
Here 是另一种 DX9(但很容易适应 XNA)实现。
【讨论】: