1.5 基于物理的渲染
我们已经知道了光在空中传播及与表面交互的一些度量,并且我们知道最终摄像机收集每个像素点的辐射亮度,以及怎样减轻由于屏幕分辨率的限制导致采样时走样的现象。虽然这一切建立在物体表面为理想光滑平面的基础之上, 但是我们通过这样简化的模型很好地讨论了计算机图像渲染的逻辑和过程。当物体表面变得复杂时,渲染方程的计算将发生变化,但是这个逻辑框架是不会变化的。所以在理解了这些渲染过程及逻辑之后,本节就开始讨论实际渲染中,光与表面交互更复杂的情形,这也是计算机图形学关于渲染部分最需要关心的重要知识。
本节我们将建立这些光与表面复杂交互过程的数学模型,各种渲染方法的实现基本上都是基于这些光照数学模型的。当然不同级别的引擎对这些数学模型有不同级别的近似,在光传输过程中的各个环节也可能使用不同的近似方法处理(正如本书将介绍的各种全局光照算法),但是本节介绍的基础知识几乎是所有全局光照模型的基础。
由于渲染方程的复杂性,以及硬件性能的限制,早期的工业运用中(甚至处于离线渲染的电影行业)大都使用一些非常近似的模型,这些模型能够产生比较理想的效果,然而这些图像结果却不是物理上正确的。所谓物理上正确的,主要指光在场景中的传输保持能量守恒(本节后面将会讲述更多关于基于物理渲染的特征)。基于物理的渲染能够使渲染结果更能够接近物理世界的品质。
自从2012年Burley的论文[cite a:PhysicallyBasedShadingatDisney]之后,游戏行业已经开始广泛采用基于物理的渲染,并在之后几年的各种技术会议上,业界各大主流游戏引擎都纷纷展示了它们基于物理渲染的效果和品质。所以本书中大多数解决方案都是基于物理的。
双向反射分布函数
当一个表面绝对光滑时,一束入 射光将按照反射定律在相应的方向上被反射,以及按照折射定律在相应的方向上被折射。对于除这两个方向以外的方向,将得不到任何来自这束入射光的光照。
我们的世界显然不是这样的,每种物体表面都有着各种不同的粗糙度,这使得光线照射到一个表面后,可以沿着不同的方向看到这些反射或折射的光。这是由于在物理世界中,每个光子入射到一个特定的微观表面上,这些微观表面由于材质的粗糙度而朝向多个不同的方向,在这个微观表面上,光与物体的交互仍然遵循反射定律和折射定律。
图(1):在数字图像的世界,每一个像素点其实对应着具有不同粗糙度的表面,这个表面位于微观尺寸,它小于一个像素的尺寸,但是大于光的波长,但这个尺寸我们很难通过几何模型来模拟(图片来自Wikipedia)
然而数字图像的世界可不是这样,由于物理世界被像素化为一个离散的数字图像,一方面对于小于一个像素的微观尺寸,我们通常无法用一种真实的几何模型表述其微观结构,如图(1)所示;另一方面,即使对于宏观的尺寸,对于较远的场景,一片较大的区域将被投射到一个单一的像素点上,而这片较大的区域拥有不同的粗糙度,使得摄像机可以从各个不同的角度看见它。
那么我们怎样表示不同物体表面的这种粗糙度性质呢?首先我们从结果上来分析,由于这种微观结构的存在,它使得来自每个方向的每束光在表面的各个方向上具有一个特定的分布函数(回想第[ref sec:intro-materials]节中讲述材质时物体微观结构上的粗糙度使得一束光在一个像素点上可以沿多个不同的方向折射或反射),这个分布函数可能由多种不同的因素决定,例如粗糙度,是否是金属结构等等,但是只要找到这个分布函数,便能够有效地计算光与表面的交互。
在数学上,用一个双向反射分布函数(bidirectional reflectance distribution function,BRDF)[cite a:DirectionalReflectanceandEmissivityofanOpaqueSurface]来表示物体表面的反射。它表示反射方向上的辐射亮度增量与入射方向辐射照度增量的比率:
(式1)
其中,是入射光方向,表示观察方向,为入射光方向与表面法线的夹角 如图(2)所示。由于在球面坐标系中,一个方向可以用一个方位角(azimuth angle)和一个天顶角(zenith angle)表示,因此整个BRDF函数具有4个变量。BRDF函数的单位为,其中为立体角。直观上讲,BRDF的值表示入射光方向单位立体角的能量在反射方向上反射的比率。
图(2):BRDF函数由2个方向组成,具有4个变量,它本质上指明了每个方向的入射光在各个方向上的反射光分布
这里使用微分方程的原因是,对于非方向的辐射照度,其与无关,但是仍然可能影响的值,然而只影响的值。即整个是由各个入射方向的光照反射的结果。
所以,给定BRDF函数,便可以求出该点处沿观察方向的辐射亮度,其值为入射方向的辐射亮度乘以BRDF函数,再乘以一个余弦因子之后,沿该点法线方向半空间的积分,即:
(式2)
其中标记表示按RGB分量相乘,因为辐射照度和辐射亮度都是RGB矢量,所有仍然表示为一个由RGB三个分量构成的矢量。方程(2)又称为反射方程(reflectance equation)。
双向表面散射反射分布函数
在第【ref sec:intro-materials】节讨论材质时讲过,对于非金属不透明(透明物体由于物体内部材质连续,光折射后在物体内部的传播方向不受改变,然后从物体表面的相反方向射出。)物体,当光进入物体内部(而不仅仅是表面)时,这些折射的光会由于物体内部结构的不连续导致光沿着不同的方向继续散射,最终一部分光会被吸收,而剩下的光会从表面的另一个不同的地方散射出来,如图(2)图所示。这种现象称为次表面散射(subsurface scattering),它使得物体的表面很浅的部分看起来具有一定的透明度,例如皮肤,塑料或纤维等。
图(3):BRDF是BSSRDF的特殊形式,即光进入物体内部经过一定的散射或吸收,然后重新从物体表面散射出来的位置,与入射点位置之间的距离小于一个像素的尺寸(图片来自Wikipedia)
如果光进入表面的点和离开表面的点之间的距离小于一个像素的尺寸,则这种交互完全可以用BRDF来描述,然而如果这个距离大于一个像素,则需要使用一个更一般的函数表示。这个函数称为双向表面散射反射分布函数(bidirectional surface scattering reflectance distribution function,BSSRDF)[cite a:GeometricConsiderationsandNomenclatureforReflectance]。BSSRDF在BRDF基础上增加一个在表面上的入射点位置和一个出射点位置,所以它是一个8维的方程,即:。
BRDF性质
物理定理赋予BRDF两个特殊的性质,第一个性质称为赫姆霍兹互反律(Helmholtz reciprocity),它说明BRDF的入射方向和出射方向可以互相对换,其值保持不变,即:
(式3)
第二个性质是能量守恒(energy conservation),即所有反射的能量不能大于所有吸收的能量(不包括物体自发光的情形),这可以表示为:
(式4)
式(4)表示对于一个给定的入射方向,其所有出射方向的BRDF积分的值小于1,这相当于针对该入射光照的出射度。可以用另一个更一般的名字来代替这个函数,即有向半球面反射(directional-hemispherical reflectance),:
(式5)
是一个一维函数,它的变量表示入射方向。的值必须介于0和1之间,当值为0时表示入射的光照全部被吸收,例如金属材料;如果所有的光照都被反射,其值为1。因为其值介于0和1之间,且包含RGB三个分量,所以也可以表示为一个颜色值。
当然在实时渲染中,这两种性质都不是绝对遵守的。因为通常绝对遵循物理规律的BRDF函数非常复杂,实际渲染中都是采取某种近似的方法,这些不同的近似方法形成不同的BRDF模型,我们将在本章后面详细讨论它们。
BRDF可视化
因为BRDF遵循物理定律,所以使用BRDF模型来计算光与表面交互的渲染技术通常又称为基于物理的着色(physically based shading),为了更好地设计和验证不同的BRDF模型,我们需要十分便利的可视化方式使得BRDF更直观,如图(4)所示。
图(4):几种不同的BRDF模型的可视化,一个表面通常同时包含漫反射和光泽反射,其中圆球部分为漫反射BRDF,而叶形状部分为光泽BRDF (图片来自[citem:BRDFExplorer})
由于物体表面微观结构不是绝对光滑的,这导致表面上的每个点反射或折射光(这里的入射光实际上是一个物体表面一个像素尺寸大小的范围内接收的来自某个方向的所有光线,实际上是微观上的多条光线。)至多个不同的方向(每个方向一条光线)。所以给定一个入射方向,BRDF的值分布在所有可能的出射方向上。在图(4)中, 球面的部分是漫反射,因为漫反射可能沿所有出射方向都有反射光;叶形状部分则是光泽反射部分。
Disney提供有一个开源的BRDF工具(BRDF Explorer[cite m:BRDFExplorer]),它可以导入并绘制给定的BRDF模型,这些BRDF模型可以由OpenGL GLSL着色语言编写,或者来自MERL数据库的对真实材质测量的BRDF二进制数据,以及MIT CSAIL的各向异性BRDF数据格式。当参数改变时,环境可以被实时地重新渲染,可以非常方便地用来分析和评估不同的BRDF模型。
菲涅耳公式
在开始讨论BRDF模型之前,还剩下一个疑问没有解决,当光由一种介质进入另一种不同的介质,在光滑的表面发生反射和折射时,入射光被反射和折射的比率分别应该是多少呢?
这个反射和折射比率由菲涅耳方程(Fresnel equation)描述,它由菲涅耳(Augustin-Jean Fresnel)于1823年根据他的光的弹性理论提出。菲涅耳公式仅取决于入射角以及两种介质的折射系数,通常用表示菲涅尔反射率(Fresnel reflectance)。根据能量守恒定律,则折射的辐射能量比率为,然而由于其折射形成的立体角的大小有所改变,因此辐射亮度的折射率却不是,以下证明过程来自[cite a:ReflectionandtransmissionoflightbyaflatinterfaceFresnelsformulae]。
图5:入射光,反射光以及折射光在两种不同介质物体的辐射亮度,其中
考虑如图(5),入射辐射亮度定义为辐射通量从方向穿过无限小立体角,照射到面积为大小的区域的能量,即:
(式6)
上式的分母表示入射“光锥”的几何范围,因为反射光具有与入射光一样大小的反射角,所以它同样具有一样大小的几何范围。因此反射辐射亮度可以表示为:
(式7)
对于折射“光锥”,由于折射角和入射角之间满足折射定律,通过对折射公式[ref eq:intro-snell-Law]求微分得:
(式8