AMD FidelityFX™ Brixelizer/GI
AMD FidelityFX™ Brixelizer GI 是一个基于计算的实时动态全局照明解决方案,建立在稀疏距离场之上。
AMD FidelityFX SDK v1.1 发布了 Brixelizer 和 Brixelizer GI。在本篇博文中,我们将讨论一些实际用例,并为您提供一些应用程序中充分发挥 Brixelizer 性能的技巧。
随着光线追踪阴影越来越普遍,为低端 GPU 提供一种硬件加速光线追踪的替代方案是理想的选择。
在此示例中,我们使用 Brixelizer 和 DXR 设置了具有 1spp 光线追踪软阴影的“Flying World”场景。以下是 DXR 和 Brixelizer 之间原始 1spp 光线追踪输出的比较。
左:DXR,右:Brixelizer
正如您所见,Brixelizer 的输出与 DXR 几乎相同。由于 SDF 场景表示的低频特性,预期会出现一些不准确之处,但随着光源变大,这些差异会因阴影变柔和而变得不那么明显。
在追踪性能方面,在此用例中,Brixelizer 大部分时间都比 DXR 快。以下是在 AMD Radeon™ RX 7900 XTX 上的性能比较。

然而,在“Sponza”这样的小型场景中,性能差距会缩小。
左:DXR,右:Brixelizer
在此场景中,Brixelizer 和 DXR 表现相似,两者性能不相上下。

通过增加体素大小,可以在牺牲质量的前提下提高 Brixelizer 的追踪性能,这会让硬阴影看起来不那么准确,但对于具有大半影的软阴影来说是可以接受的权衡。
与 DXR 类似,Brixelizer 的性能也会随着光线发散而下降。因此,在软阴影的情况下,要小心光源的大小。
环境光遮蔽是为您的场景添加漂亮的间接阴影而无需全局照明的一种绝佳方法。使用 Brixelizer,您可以添加更准确的 AO,而不会受到屏幕空间技术的限制。
与软阴影类似,我们使用 Brixelizer 和 DXR 设置了“Flying World”场景中的相同 1spp 光线追踪环境光遮蔽。我们随机采样像素法线周围的半球并发出可见性射线。以下是 DXR 和 Brixelizer 之间原始 1spp 输出的比较。
左:DXR,右:Brixelizer
同样,任何不匹配都是由于 SDF 的低频特性。由于 SDF 表示的表面可能略高于实际几何体,您需要调整光线偏移量,沿法线方向移动光线原点,以匹配 DXR 的输出。
在“Flying World”场景中,Brixelizer 的性能比 DXR 实现更快,光线相对较短,体素大小为 3.0。

然而,在“Sponza”中,相同长度的光线与 DXR 在体素大小为 0.2 时性能相似,在该比例下提供相似的细节水平。
左:DXR,右:Brixelizer

我们还可以使用更长的光线来实现大范围遮蔽。同样,通过 Brixelizer 进行追踪时,我们可以非常接近地匹配 DXR 的结果。
左:DXR,右:Brixelizer
对于这种质量的距离场,Brixelizer 在使用更长的光线时性能会急剧下降。但是,我们可以通过调整体素大小来获得更粗糙的场景表示,从而更快地追踪,从而挽回一些性能。

使用体素大小为 2.0 的 Brixelizer 重新占据领先地位。您可以看到,较大的体素大小会导致 SDF 更加粗糙。
左:体素大小 = 0.2,右:体素大小 = 2.0
尽管如此,最终的环境光遮蔽输出在视觉上是相似的,并增加了一些光线偏移来将光线推到表面。
左:体素大小 = 0.2,右:体素大小 = 2.0
较长的光线追踪性能比短的光线差,但您可以通过增加体素大小来权衡准确性以获得更高的性能。
增加光线偏移和 T-min 值,以防止由于 SDF 的粗糙度而导致的自遮蔽。
除了追踪性能,我们还需要特别注意确保 SDF 生成尽可能快。有几个因素对此有贡献,我们将(无意中)更详细地进行介绍。
网格 LOD 在 Brixelizer 的更新成本方面起着重要作用,因为它直接对应于每帧所需体素化的三角形数量。虽然这对于静态几何体来说不是什么大问题,但对于移动或动画对象来说却是一个巨大的问题,因为这些对象会因为动态对象每帧都被体素化而严重减慢 Brixelizer 的体素化阶段。当更新较大的级联时,这个问题会加剧,因为您必须在一个帧内处理更多的动态对象。

我们采用了上述“Toy Shop”场景,并强制在每帧中完全重建 SDF,以夸大 LOD 的性能成本。在 LOD 0 下,场景包含约 4000 万个三角形。下面的图表显示了 LOD 0 与 LOD 1 的完全重建成本。

如前所述,这些数字是在强制完全重建场景的情况下得出的。然而,当我们只重建场景的动态部分时,我们仍然可以看到性能提升,尽管由于该场景没有太多动态元素,其提升不如前面的示例显著。

影响更新性能的另一个因素是体素大小。体素大小越大,生成的距离场越粗糙。这可以提高更新性能,因为它可能导致生成的体素-三角形引用更少。
下面的图表显示了在“Toy Shop”场景中,级联 0 在各种体素大小下的更新时间性能结果,并且每帧进行完全的级联重建。

在这里,我们可以看到将体素大小从 0.3 增加到 0.6 会显着降低级联 0 的更新成本。然而,从 0.6 增加到 0.9 几乎没有带来任何改进。这是因为每个级联都有固定的 64x64x64 体素分辨率。这意味着增加体素大小也会增加级联的整体占用空间,如下所示。

因此,我们必须处理具有较大体素大小的级联中的更多三角形。在某些情况下,这也可能导致性能下降。因此,需要仔细调整才能达到最佳平衡。
AMD FidelityFX Brixelizer 提供了多种选项,可帮助您为应用程序实现所需的质量和性能平衡。让我们回顾一下这篇博文的关键要点:
增加体素大小以提高追踪性能。
发散光线的追踪成本比相干光线更高。
应用较大的光线偏移以补偿深度缓冲区和 SDF 表面之间的不匹配。
为您的网格资源使用更粗糙的细节层次以提高 SDF 更新性能。
如果更新性能仍不理想,请在一定程度上增加体素大小。
享受使用 Brixelizer 进行光线追踪的乐趣!
AMD FidelityFX Brixelizer GI 示例 (两者使用相同示例)
性能测试系统:AMD Ryzen™ Threadripper™ PRO 3975WX、AMD Radeon RX 7900 XTX (AMD Software: Adrenalin Edition 24.2.1)、128GB DDR4-3600 内存、ASUS Pro WS WRX80E-SAGE SE WIFI 主板、1TB M.2 NVME SSD、Windows® 10 Pro 22H2