为什么在路径跟踪中使用帐篷过滤器?


12

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

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

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

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

Answers:


13

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

帐篷过滤器(三角形过滤器)肯定比箱形过滤器更类似于sinc过滤器的中心峰:

sinc,三角形和框形滤波器

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

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

至于为什么smallpt特别使用帐篷过滤器,我猜想性能(它是评估的快速过滤器)和简洁性的结合-可以用几行代码完成,而双三次过滤器则需要花费更多码。

顺便说一句,smallpt实际上使用2x2子像素网格,并在每个子像素处放置一个帐篷滤镜,然后将四个子像素的结果平均在一起。因此,奇怪的是,总体效果是四个帐篷的总和,最终看起来像一个金字塔,顶部平坦:

亚像素帐篷滤镜

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


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

3

我刚刚看了有关双线性插值的Wikipedia文章。帐篷过滤器是一种双线性插值。双线性插值在2维上进行插值。它首先在一个维度上进行线性插值,然后在另一个维度上进行线性插值。

在此处输入图片说明

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

之所以比平均颜色更好,是因为当其中一个点比另一个点更靠近中心时,它对最终颜色的贡献更大。通过平均颜色,即使一个点比另一点更靠近中心,所有点的贡献也相同。

如果所有4个点都位于距中心等距离的固定位置上,那么您对所有点的贡献都恰好是25%,这与求平均值相同。

这意味着当您实现抗锯齿时,只需以4倍的高分辨率进行渲染,然后对其进行下采样。据我了解,这两种方式之间的输出应该相同。

那么,您应该使用哪个过滤器?好吧,这取决于您想要什么和您的情况。如果您为样本选择随机的子像素位置,则最好使用双线性插值。如果所有点都是固定的,而您只是以较高的分辨率进行渲染,则取平均值可能会很有用。最后,这只是通常您不会或几乎不会注意到的一些子像素的事情,因此,如果有AA的话,那就足够了。但这只是我的观点,可能是3D动画或类似内容的一般观看者的观点。

双三次插值使您看起来更平滑。双三次: 在此处输入图片说明

双线性: 在此处输入图片说明

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

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

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

https://zh.wikipedia.org/wiki/Bicubic_interpolation

(图像来自维基百科,属于公共领域)

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.