【问题标题】:Sorting meshes in XNA在 XNA 中对网格进行排序
【发布时间】:2012-12-19 03:33:20
【问题描述】:

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

【问题讨论】:

    标签: c# xna xna-4.0 mesh alphablending


    【解决方案1】:

    3D 环境中的 Alpha 混合可能是一个棘手的问题。肖恩·哈格里夫斯(Shawn Hargreaves)几年前写了一封article,涉及大部分主要问题(标题为画家算法的部分专门处理您的问题)。长话短说:没有技术可以完美地做你想做的事,所以问题就变成了:你愿意做出什么取舍?

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

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

    【讨论】:

    • 不——有一种技术可以做他想做的事。
    • 我没有说没有任何技术可以做他想做的事。例如,对每个三角形进行单独排序是一种非常简单的技术,可以满足他的要求。我说没有完美的技术,深度剥皮也是如此。它需要您使用 HiDef 配置文件,它需要您编写复杂的着色器,它需要额外的几何通道,这些通道可能会或可能不会被接受......只有 Thun 可以回答什么技术适合他的需求的问题。我建议了其中之一。
    • 这种排序是在片段级别完成的,所以它实际上会在足够多的通道下产生像素完美的结果。也很容易针对性能与质量进行微调。尽管您说它很复杂并且需要多次通过是对的。
    • 我使用了 Alpha 测试,但在边缘有失败的余地。我的意思是边缘 alpha 失败并且像素没有适当的值。但我想这比编写着色器要好。我正在学习 XNA,我只在 HLSL 中编写了一些基本效果(如基本闪电),所以现在深度剥离对我来说可能很难。感谢您的帮助
    • 您应该能够通过修改其参数来调整AlphaTestEffect 的工作方式。特别是,ReferenceAlpha 属性用于确定失败/通过阈值。将它设置为 1 应该会给你一个干净的优势,但它仍然可能看起来不太正确。您需要重新制作叶子纹理,以考虑到您没有任何部分透明度。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 2015-02-08
      相关资源
      最近更新 更多