我们的Void 和 Cluster蓝噪声的GPU 实现对我们来说效果很好。它提供了许多调整参数,即使蓝色噪声纹理很小,也有助于进一步消除低噪声频率。时空效果的扩展很简单:fract(blue_noise + per_frame_random)。
之前尝试使用多个蓝色噪声纹理序列效果不佳。简单的fract(bs+rnd)环绕随着时间的推移提供与多个不相关的蓝色噪声纹理相同的白噪声信号。Nvidia Spatiotemporal Blue Noise 蓝噪声扩展可随着时间的推移消除白噪声。它可以提高图像质量,而无需额外成本,因为除了效果的随机种子不同之外,每个帧都以完全相同的方式渲染。
我们希望保持蓝噪声的优势,例如出色的性能和可变西格玛,并最大限度地重用当前算法的代码。这个想法很简单:对层使用 Void And Cluster 算法并添加层之间的相关性。因此,我们在当前实现中添加了几行,使用最后的蓝噪声结果作为新一代的输入种子。这保留了每层蓝噪声的质量,但是时间相关性又如何呢?结果是有希望的。随着时间的推移,低频的幅度开始降低,但仍然不完美。这是因为蓝噪声生成的下一次迭代进行了逆序列,并且结果与之前的层几乎相同。经过几次不同输入种子抖动和随机化的尝试后,
这是 XY/XZ/YZ 切片上具有不同西格玛 (2.0、1.6、1.2) 的 64 个蓝噪声 (64×64) 图像频谱的序列。正如你所看到的,时间上根本不存在低频,我们仍然可以像以前一样控制 XY 切片中的中频数量(8×8 层网格):
现在让我们看看单个包裹的蓝噪声图像(随时间变化的白色)和一系列蓝噪声图像(随时间变化的蓝色)之间的差异。具有 1.6 sigma 值的 64x64x32 噪声最适合我们。这是仅使用 8 个样本的 PCF 阴影贴图的并排比较(在现代 GPU 上速度超快)。几乎所有不需要的蓝色噪声平铺伪像都消失了:
与 Nvidia STBN (128x128x64) 的比较还显示,2spp 的光线追踪环境光遮挡和 1spp 的反射的图像有所改善。这很有趣,因为我们仍然使用尺寸小 8 倍的 64x64x32 噪声。“单层”是带有白噪声包裹的噪声序列的第一层。“全部”是序列中的所有层。
改进的蓝噪声发生器的高级源代码可在我们的GitHub页面上找到。源代码需要 Tellusim Engine,但您可以将其用作噪声探索的起点。
适用于 Windows、Linux 和 macOS 的即用型二进制文件:
- Linux:TellusimBlueNoise_linux.zip
- macOS:TellusimBlueNoise_macos.zip
- Windows:TellusimBlueNoise_windows.zip
1.6 sigma 的即用型噪声序列:
- 64x64x32: png ktx
- 64x64x64: png ktx
- 128x128x64: png ktx (M1 Max 上为 108 秒)。
- 256x256x128: png ktx (M1 Max 上 21 分钟)。
我们感谢本文中使用的以下 Sketchfab 模型: