99行C路径跟踪器Smallpt为要渲染的每个像素渲染一个2x2的子像素网格,然后执行帐篷过滤器将它们组合。

这里有一个有趣的演示解释了代码,提到帐篷过滤器,但没有解释为什么它在那里。

谁能解释为什么在这种情况下,帐篷过滤器比盒子模糊(仅对样本取平均值)更合适?

使用比帐篷过滤器更好的东西(例如双三次Hermite插值法)是否会带来更高的质量?

#1 楼

理论上理想的用于离散采样数据的抗混叠滤波器是Sinc滤波器,因为它可以完美地去除所有高于奈奎斯特频率的频率,而不会留下所有较低的频率。因此,在某种程度上,我们可以预期抗锯齿滤镜与sinc滤镜更相似,以产生更高质量的图像。

帐篷滤镜(三角形滤镜)当然更像sinc滤镜的中心峰。比盒式滤波器更紧密:



双三次滤波器(例如Mitchell-Netravali)甚至可以更精确地捕获正弦的形状,包括其前两个负瓣。

滤波器选择的实际情况比“尽可能接近正弦”要微妙得多,因为“非理想”抗锯齿滤波器会产生不同种类的伪像,例如如混叠,模糊和振铃。同样,不同的过滤器可能或多或少地在计算上昂贵。因此,这是一个试图权衡不同工件之间以及性能之间进行权衡的游戏。不同的场景/图像可能会偏爱一个选择或另一个选择,这在某种程度上也是一种审美判断。

关于为什么为什么smallpt特别使用帐篷滤镜,我想结合一下性能(这是一种快速的方法)过滤器以评估)和简洁性-只需几行代码即可完成,而三次过滤器则需要更多代码。在每个子像素处进行滤波,然后将四个子像素的结果平均在一起。因此,奇怪的是,总体效果是四个帐篷的总和,最终看起来像是一个金字塔,顶部平坦:



我不确定这是故意的,还是恰好是解决问题的方式。我的猜测是,与每个像素使用一个帐篷滤镜相比,这会产生更清晰的图像(由于支持范围更窄),但可能还会出现更明显的锯齿。

评论


$ \ begingroup $
我忍不住说谢谢!实际上,我首先将其理解为具有4个层的分层抽样。并且我可以自定义“层”的数量,例如9、16 ...现在,我知道它是一个“梯形”过滤器(在其他渲染器中并不常见)。当我的“阶层”数趋于无穷大时,该过滤器变成了箱式过滤器,我在上面画百合花……有趣!
$ \ endgroup $
–chaosink
18年5月1日在15:48

#2 楼

我只是看过Wikipedia上有关双线性插值的文章。
帐篷过滤器是一种双线性插值。
双线性插值在2维上插值。
它首先在一个维上线性插值,然后在一个维上线性插值。其他。



查看此图片时,它首先在列上执行,然后在行上进行执行。

原因为什么这比对颜色进行平均更好,原因是当其中一个点比另一个更靠近中心时,它对最终颜色的贡献更大。
对颜色进行平均,即使在一个点比另一个点更靠近中心。

如果所有4个点都位于距中心等距离的固定位置上,那么您在所有点上的贡献都是25%,这是相同的作为平均。

这意味着当您通过仅以4倍的高分辨率渲染然后降低采样率来实现抗锯齿时ng。据我了解,两种方式之间的输出应该相同。

那么,您应该使用哪个过滤器?好吧,这取决于您想要什么和您的情况。如果您为样本选择随机的子像素位置,那么最好使用双线性插值法。 />最后,这只是您通常不会或几乎不会注意到的一些子像素问题,因此,如果使用AA的话,那就足够了。但这只是我的观点,可能是3D动画等普通浏览器的观点。

双三次插值可以使您看起来更平滑。
双三次:


双线性:


哪个更好?好吧,这取决于您的喜好,我认为不会有很大的不同。

我的资料来源:
https://en.wikipedia.org/wiki/Reconstruction_filter#Image_processing

https://en.wikipedia.org/wiki/Bilinear_interpolation

https:// en。 wikipedia.org/wiki/Bicubic_interpolation

(图像来自Wikipedia并属于公共领域)

我希望这会有所帮助,我只想说我不是专业人士我只是喜欢计算机图形学的人。可能是我犯了一些错误。如果是这样,请说出来,然后我更改它!