我一直在研究自己的渲染器一段时间,我想知道是否有任何方法可以消除渲染图像中的蒙特卡洛噪声,除了等待很长时间才能收敛?

我发现的方法是使图像模糊,这并没有太大帮助,因为它会大大降低图像的质量/清晰度。而且我可以通过渲染带有更多样本的小图像然后将其放大来实现相同的目的。

是否有设计用于在路径跟踪中处理图像中噪声的算法?

评论

您是否对掩盖噪声的后期处理或加快收敛速度​​以减少噪声的方法更感兴趣?

FWIW的Benedikt Bitterli最近根据他的去噪纸发布了以下twitter.com/tunabrain/status/872174108385136640。

在后处理区域,有一个很好的算法,称为双边滤波器shadertoy.com/view/4dfGDH

#1 楼

有,而且我很期待看到其他答案的细节,但是一种解决方法是一开始就不要在源数据中产生噪声(或尽可能多的噪声)。

噪声来自以下事实:渲染中存在高方差-所采集的样本数量尚未收敛到积分的实际正确答案,因此某些像素过高/过亮,而某些像素过高/过亮太低/暗淡(在每个颜色通道中)。

问题是这样的:如果使用白噪声随机数进行采样,则可能会像下面的图像一样使采样聚集在一起。给定足够的样本,它将收敛,但是要花一些时间才能很好地覆盖整个样本空间。在下面的图像中找到一个空白区域(如右下角),并想象那里有一小段明亮的光,其他地方场景都很暗。您可以看到那里没有任何采样会给渲染带来问题。



或者,您可以像下面这样均匀间隔采样,但这会为您提供混叠伪像而不是噪声,这更糟。



一个想法是使用低差异序列并进行准蒙特卡洛积分(https:// en。 wikipedia.org/wiki/Quasi-Monte_Carlo_method)。低差异序列与蓝噪声有关,蓝噪声仅具有高频成分。通过这些路线,您可以更快地收敛$ O(1 / N)$而不是$ O(\ sqrt {N})$。这些可以更好地覆盖样本空间,但是由于它们具有一定的随机性(或类似随机性的质量),因此它们没有常规间隔采样所具有的混叠问题。

这里是“ “抖动的网格”,您可以在网格上进行采样,但是在像元大小内使用小的随机偏移量。这是由pixar发明的,并获得了一段时间的专利,但不再使用:


这是一个常见的低差异序列,称为Halton序列(基本上是Van Der Corpus的2d版本)。算法:

更多信息,包括生成这些图像的源代码,可以在这里找到:https://blog.demofox.org/2017/05/29/when-random-numbers-are -随机低差异序列/

#2 楼

您可以使用的一种技术是将图像分成多个块并测量每个块的方差-这样,您可以将更多样本应用于具有更高方差的块。

可以通过使用2个累积缓冲区而不是1来估算方差。将每个遍次渲染到一个备用缓冲区中。这些缓冲区之间的绝对差(相对于每个块)与方差成正比。在显示到屏幕上后,您可以将两个缓冲区加在一起以获取全部的累积缓冲区。