Chaos

无偏差渲染的真相

 

多年以来,关于有偏差渲染和无偏差渲染,究竟孰高孰低,一直存在着许多争论。许多人使用“无偏差”这个术语来暗示这种方法是更准确的。市面上几乎所有的渲染器都有某种程度的偏差计算,即使是那些声称自己是无偏差的,因为有偏算法其实更快速,更智能,而且也不一定就是不准确的。为了理解这一点,本文将会展开阐述一下。

 

什么是无偏差?

 

无偏差实际上意味着在计算渲染图片的时候没有走捷径。每一支射线,都被平等看待,没有任何重要性方面的偏袒。正因为如此,若想得到一个干净无噪点的结果,需要庞大的射线数量。我能找到的对于无偏差效果最好的描述之一来自于 Vlado,最初发表在 Chaos Group 论坛中。

“理论上,以无偏差的方式计算一个积分(在这里就是渲染公式)是这样一种方法,如果你以相同的输入信息(3D 场景)多次计算,平均下来以后,你会得到正确的结果(最终成果图),尽管每次独立的运算结果可能错的挺离谱(例如,噪点很多)。这也就意味着,如果你把算法执行多次,然后平均最后的结果,你就会得到正确的最终图。你可以把这个想象成 V-Ray 的渐进式采样器在消除图片噪点过程中的多遍反复采样通道。每一个独立的采样通道都是有很多噪点的,但是当大量通道平均到一起的时候,你就得到了干净的最终图。”

那么你也许认为渐进式渲染就是无偏差的。其实这种想法错了。渲染器可以采取非常多的偏差计算手段来加速渲染,但同时仍然是渐进式渲染器。这些优化手段可以变成参数面板由用户来控制,也有可能被隐藏起来,不让用户看到。

如果你的光线追踪渲染器非常快,那么很有可能它就是偏差计算的。渲染器的偏差程度就取决于软件开发者以及用户的参数设置。如果你的渲染器开放出了许多偏差计算参数让用户决定开关,那么用户需要知晓他们所做选择的后果。

 

对无偏差计算的常见误解

 

以下就是一些对于无偏差计算的常见误解:

无偏计算是物理准确的 – 无偏渲染可不是和准确画等号,同时有偏渲染也不是不准的。无偏和有偏其实都是物理不准确的。其实使用 BRDF 计算,比如 Blinn 或者 GGX 本身就是对真实世界材质的近似。其实问题就变成了哪种方法能够以更快的方式得到物理上可信的计算结果。对于这一点,下文会解释。

无偏计算意味着更少的参数设置 – 一款渲染器参数设置少可不代表它就是无偏差的。其实只是许多有偏差的参数设置被写在了渲染器代码中,没有暴露给用户。

Brute Force GI = 无偏 – 许多人认为如果在计算全局照明的时候使用了预缓存的数据,那么渲染器就是有偏的。确实是这样,预缓存全局照明数据是有偏的,但是 brute force GI 也可以是有偏的。

路径追踪是无偏差计算 – 即使是路径追踪,也有很多有偏的捷径可以走,所以这也是误解。

 

是什么让渲染器变得有偏差呢?

 

那么你现在也许想知道:渲染是如何从无偏差变得有偏差的?这些捷径是什么?有很多常见的近似手段。有些近似手段在 V-Ray 中把参数开放出来了,让用户可以选择这些捷径,而且可以选择使用程度。其他渲染器可不一定把这些选项暴露出来。这可能是为了简化用户界面,也有可能是为了让用户相信他们没有走捷径,渲染是无偏差的。

 

如下是几个让渲染引擎变得有偏差的参数设置或者说是捷径的例子:

定义光线的反弹次数 – 无偏计算,不应该限制射线的反弹次数,而应该等待射线弹出场景或者完全被吸收。

使用预缓存 – 复杂的射线追踪问题可以用这种插值方法解决,比如上百次反弹的全局照明,或者焦散计算,就是有偏算法,可以加速效果的计算,而且可以显著增加光线的计算数量。

自适应采样 – 更偏重计算有可能重要的区域的射线。 例如,你可以偏重计算光源附近的射线,或者你的全局光缓存显示有显著全局光贡献的区域。

抑制或删除焦散射线 – 这在许多渲染器里都很常见,因为焦散计算开销非常大。

截断(钳制)或减低超过特定亮度的射线强度来减少 firefly 现象 – 这是非常常见的近似手段,比如模糊反射射线经常有可能会随机撞到非常明亮的光源。钳制次级射线的亮度,你就能减少这种亮点 (又被称作 fireflies 萤火虫) 。任何钳制或者使用任何类型的容差或者阈值来判定是否追踪一条射线都会让渲染引擎变得有偏差。这些技术都可以减少计算量,加速渲染。

 

什么是正确的?有偏或者无偏?

 

使用这些近似手段,并不意味着偏差计算就不如无偏来得计算准确,精准,或者物理正确。以下是再一次引用 Vlado 在 Chaos Group 论坛中说的:

“我最近很惊讶地发现很多人以为“无偏差”这个术语代表“物理正确”,而“有偏差”就是物理不准确的。其实,这两个词的关系有点像在科学探讨语境下“精确”和“准确”的区别。无偏计算有着高度的精确性,但是不意味着保障了准确度(也就是与真实正确结果的接近程度)。反过来说,也是对的 – 有偏计算也可以是非常正确的(例如非常接近实际的结果),但是通常不太严谨。”

所以偏差渲染实际上是可以做到物理正确的,在大多数情况下都可以,也可以得到对的结果。如果你的目的是尽可能快地得到一张看起来物理正确的图片,那么你需要的是有偏计算。如果你需要的是确保每一支可能的射线都被计算到,即使是没有可察觉的区别,那么你需要无偏计算。

 

哪种更好呢?有偏还是无偏?

 

大多数渲染器都会使用有偏算法,即使它们管自己叫无偏渲染器。因为如果它们不这么做,渲染速度会慢得难以忍受。有偏引擎是非常聪明的,它们会采用最有效率的方法得到正确的图片。其实,你甚至可以管无偏计算,叫无效率计算。

在论文中,无偏这个术语听起来比有偏要高级,因为“无”这个前缀代表了无限无妥协。但是有意思的是,如果人们把“无偏”替换成“耿直”,“有偏”替换成“聪明”,其实也是合适的,聪明人会选择有偏计算的。

长话短说:如果你在做科学的物理计算有大把的时间和计算资源,无偏计算很适合你。如果你感兴趣的是在可接受的时间内渲染一张物理上可信的图片,有偏算法会帮助你更快地达到结果。极大的可能是你其实已经在这么做了,你自己都不知道,不管你用的是哪一款渲染器。

 

知道啦,都是有偏差的,但是我就是想要更少的参数设置。

 

你可以选择暴露这些参数让用户决定偏差的程度,或者你也可以把参数藏起来。V-Ray 有更多参数选项的原因是不同的用户有不同的需求。在过去的几个版本中我们做了很多努力,来减少你能看到的初始参数。这就是为什么很多 V-Ray 参数只有切换到“高级”或“专家”模式才能看到。我们还做了很多努力,减少 V-Ray 的调整难度,现在如果一个用户想要打开场景,点一两个按钮直接渲染,是完全可以的。

在最近的版本中,V-Ray 预设为忽视掉大多数用户有可能拖慢渲染速度的设置(比如灯光和材质细分)。许多用户会发现,当他们打开老场景的时候,渲染速度有巨大的提升。这是真的,因为 V-Ray 核心在过去的几个版本中有重大加速,忽略掉老参数也会极快的加速渲染。

好消息是,在大多数情况下 V-Ray 三个参数就够用了。下面这个视频,Vlado 解释了他的常用流程,将参数限制到了仅有几个,帮助用户加速场景渲染速度。事实上,视频中 Vlado 推荐的参数,会成为我们新版的默认参数,所以大多数用户可以用默认参数渲染场景,什么都不需要调整,就可以得到满意的结果。

 


V-Ray 其实可以是真正无偏计算的

 

另一个事实就是,大多数人不知道因为 V-Ray 开放了所有参数,所以从技术上来说,可以使用 V-Ray 做无偏渲染。这样一来,你就能看到有偏计算和无偏计算的区别。你会发现,除了渲染变得巨慢无比,用户很难察觉到图片有什么实质性的区别。

 

结论:有偏计算是完全可以用的,这也是为什么所有人都在使用它们!

 

再一次,我们借用约翰·卡马克的智慧,而且他已经说过了我想说的话,只需要把“优化”替换成“有偏”。

“如今我们做了大量的工作,这就是显卡渲染的现在所追求的,如何在不同的情况下优化路径追踪的速度。但是总归你要根据你想要的东西做一些近似。 (…) 但这种近似,往往是很有效的。”

Chaos
© 2024 Chaos Software 保留一切权利