使用逐像素排序链表的与顺序无关的透明度
此示例的源代码可在 Khronos Vulkan 示例 github 存储库中找到。 |

算法
OIT 算法由两个阶段组成:收集阶段和组合阶段。
在收集阶段,透明几何体被渲染到逐像素排序的链表中。每个片段的颜色和深度都被推送到与其目标像素关联的链表中。链表的头存储在大小与屏幕相同的存储图像中。片段数据(颜色和深度)存储在所有链表共享的存储缓冲区中。
组合阶段是一个屏幕空间操作。对于每个像素,它会对存储在该像素链表中的片段进行排序。然后,它将它们进行 alpha 混合(在着色器代码中)以产生最终的透明颜色和覆盖率。最后,它将透明颜色通过固定混合函数混合到后缓冲区中。
该算法可以产生像素完美的结果,即使在几何体相交的情况下也是如此。但是,有一个问题。为了保持高性能,每个像素排序的最大片段数限制为 16。对于超过 16 个片段,该算法会尽最大努力混合额外的片段,但结果可能不准确。对于示例来说,这已经足够好了,因为对象在场景中的放置方式。一般来说,性能和正确性之间需要权衡。为了保持较高的占用率,每个排序片段的最大数量(combine.frag
中的 SORTED_FRAGMENT_MAX_COUNT
)应保持较低。为了在任何情况下都获得正确的结果,该数字应尽可能高。通过使用“每个像素排序的片段”选项,可以观察到每个像素排序的片段数量较少导致的伪影。