在光线跟踪/路径跟踪中,最简单的抗锯齿图像方法之一是对像素值进行超采样并取平均结果。 IE浏览器而不是通过像素中心拍摄每个样本,而是使样本偏移一定量。

在Internet上搜索时,我发现了两种稍微不同的方法:

根据需要生成样本并使用过滤器称量结果


一个示例是PBRT



生成具有等于滤镜形状分布的样本


两个示例是smallpt和Benedikt Bitterli的钨丝渲染器





生成并称重

基本过程是:


根据需要创建样本(随机,分层,低差异序列等。)
使用两个样本(x和y)使相机光线偏移。参考像素中心。例如Box滤镜,Tent滤镜,Gaussian滤镜等)。


将权重应用于渲染器中的颜色br />以滤波器的形状生成

基本前提是使用逆变换采样来创建根据滤波器的形状分布的样本。例如,以高斯形状分布的样本的直方图将是: smallpt使用帐篷过滤器的确切逆cdf。合并方法的示例可以在此处找到。



问题

每种方法的优缺点是什么?为什么要在另一个上使用一个?我可以想到几件事:

生成和称重似乎是最可靠的,它允许将任何采样方法与任何过滤器进行任意组合。但是,它要求您跟踪ImageBuffer中的权重,然后进行最终解析。 Lanczos),因为您不能使用否定的pdf。但是,如上所述,由于不需要跟踪任何权重,因此更易于实现。

最后,我想您可以将方法2视为方法1的简化,因为它实际上是使用隐式的Box Filter权重。

评论

只是大声思考...您能否分别对滤波器的负部分建模以生成两组样本,其中一组被视为正样本,另一组被视为负样本?这会允许您为第二种方法使用任意过滤器(以过滤器的形式生成)吗?

也许? Lemme摆弄了一下

好的,如果您跟踪函数的零,则可以将输出abs()吸收到pdf中。然后在采样时,您可以检查是否为阴性。这里的示例代码:gist.github.com/RichieSams/aa7e71a0fb4720c8cb41

#1 楼

关于该主题,2006年有一篇出色的论文,《过滤器重要性采样》。他们提出了您的方法2,研究其性能,并普遍赞成该方法。他们声称,该方法可提供更平滑的渲染结果,因为它会加权所有对像素有贡献的样本,从而减少最终像素值的差异。这是有道理的,因为在蒙特卡洛(Monte Carlo)渲染中一个普遍的准则是,重要性采样将比加权采样提供更低的方差。

方法2还具有易于并行化的优势,因为每个像素的计算它们独立于所有其他像素,而在方法1中,样本结果在相邻像素之间共享(因此,当像素在多个处理器之间并行化时,必须以某种方式进行同步/通信)。出于同样的原因,与方法1相比,方法2进行自适应采样(图像的高方差区域中的采样更多)比方法1容易。从滤波器的abs()采样,然后用+1或-1加权每个样本,如建议的@trichoplax。但这实际上增加了方差并且比方法1差,因此他们得出结论,方法2仅适用于正滤波器。

话虽如此,本文的结果可能无法普遍适用,哪种采样方法更好取决于场景。我在2014年写了一篇博客文章,使用合成的“图像函数”而不是完整渲染,独立地研究了此问题,并发现方法1由于可以更好地平滑高对比度边缘,从而在视觉上提供了令人满意的结果。 Benedikt Bitterli也对此发表评论,他的渲染器报告了类似的问题(使用方法2时,光源周围的高频噪声过大)。除此之外,我发现这两种方法之间的主要区别在于产生的噪声的频率:方法2给出了更高频率的“像素大小”噪声,而方法1给出了2-3个像素的噪声“颗粒”,但是两者的噪声幅度相似,因此哪种噪声看起来不太糟糕可能是个人喜好问题。

评论


$ \ begingroup $
谢谢!这些都是很棒的资源。那么,到底有3种方法? 1.生成并称重带有飞溅2.生成并称重而不带有飞溅3.以过滤器形状生成
$ \ endgroup $
–RichieSams
16 Mar 3 '16 at 15:54

$ \ begingroup $
您是否知道有任何论文,博客等探讨如何将“生成”和“权重”与splatting并行化?在我的头顶上,每个图块可能有一个互斥量,或者使每个像素都是原子的。
$ \ endgroup $
–RichieSams
16 Mar 3 '16 at 15:57

$ \ begingroup $
@RichieSams实际上,我不知道您为什么要使用“生成和称重而不会产生飞溅” —在任何情况下,这似乎都比过滤重要性抽样更为糟糕。我以为“产生并权衡”意味着会出现飞溅。至于喷溅的并行处理,一种方法是将图像分割为多个图块,但为每个图块提供2×3像素的边框以捕获穿过图块边缘的图块。然后,在最终遍历中,将带边框的图块叠加在一起,形成最终图像。
$ \ endgroup $
–内森·里德(Nathan Reed)
16 Mar 3 '16 at 18:20