【Computer Graphics】08_PBR

————————————————————————————

阅读说明:作者还在入门中,文章如有错误,请务必指正,万分感谢!

————————————————————————————

 

  PBR,Physically-Based Rendering,基于物理的渲染,是一种对真实世界中的光与物体的交互过程进行数学模拟,试图在渲染引擎中让模型对光源作出正确反应的渲染理念。

 

唠一唠光和物体的交互

  首先,我们来考察一下真实世界中的光与物体是如何交互的。只有理解了这个过程,我们才能将这些繁杂的物理事实抽象归纳成可计算的数学公式。

  当一束光从介质A进入介质B时,位于AB交界处的表面一点p会将这束光分割成两个方向:一部分反射回介质A,另一部分折射进介质B。反射光线与折射光线的分配比例取决于两个因素:①物体的属性,比如,金属的反射率较高,非金属的反射率较低;②入射光的角度(与表面法线的夹角),入射角越大,反射率越高,也即菲涅尔效应。

  我们先来探讨反射光线的行为。在初中物理中我们学过,镜面反射的反射角等于入射角,但真实世界中的物体表面不都是理想光滑的,而是有一定粗糙度的。对于一个粗糙的表面,我们通常用微表面模型来分析它,即将它视作若干无限小的、法线方向各异的理想表面的集合,那么粗糙度就反映了微观表面法线方向与宏观表面法线方向的不重合程度,或者说粗糙度就代表了与宏观表面法线方向不一致的微观表面法线的占比。当我们固定观察视角时,只有那些法线方向与半程方向(入射光方向与视角方向的夹角被半程方向分半)重合的、且没有被微表面遮挡的反射光线才会被看到,这些最终被看到的光线被称为“高光反射”。

  我们再来探讨折射光线的行为。折射进介质B的光线会被介质内的粒子不断地散射和吸收,最终一部分光线被吸收干净转化为其他能量,一部分光线被折射回介质A,另一部分光线则会穿透介质B。折射回介质A的光线与入射点p的距离可能小于1个像素,也可能大于1个像素。对于前者,我们忽略这点微小差距并将出射点视作p;对于后者,我们需要用到次表面散射技术,这里不予考虑。同样,对于穿透介质B的光线也不予考虑。那么,我们只需考虑一种情况:折射进介质B的光线最终又被折射回介质A,形成“漫反射”。漫反射光线的占比和物体属性有很大关系,比如金属对光线的吸收率很高,那么漫反射光线自然就会少;非金属对光线的吸收率较低,那么漫反射光线自然就多。

Fig.1. 高光反射和漫反射

 

从文字描述到数学公式

  现在我们来考虑如何将上述文字描述转换为数学表达式,并引入渲染引擎中。想象一下,如果你是这个数学模型的设计师,你会想到些什么?

①    在上面的文字描述中,我们对光和物体的交互过程进行了一定的简化:我们暂时忽略了出射点和入射点相隔较远的次表面散射,以及那些穿透介质的光线。因此,我们只需关注两种光线:高光反射光线和漫反射光线。而其中的重点就在于“反射比例”,也即探讨一束入射光线最终有多少被反射到接收设备中。这个比例在不同方向上的数值分布就是BRDF(Bidirectional Reflectance Distribution Function),可以被分成高光反射项(Specular Term)和漫反射项(Diffuse Term)两个部分。这两个部分正是PBR模型致力于去描述的东西。

②    显然,不同设计师会对光和物体的交互过程建立不同的数学模型,那么自然就会有不同的BRDF公式。出于节省脑细胞的目的,后文只介绍Disney原则的BRDF,因为它很常用。而Disney原则的BRDF是艺术导向的,并不一定是完全物理正确的,因此个人认为,在学习的过程中没必要去纠结每个公式“到底是如何得来的”,只需要理解每个项目“到底被哪些因素影响”以及“这些因素的影响趋势”即可。

③    在渲染中,我们只关注两类物质:金属和非金属。

  金属的光线反射率和光线吸收率都很高,即便当入射角呈0°时,也会有70%~100%的光线被直接反射出去,剩余的折射光线则大多被吸收了。因此我们认为,金属有很强的高光反射,但没有漫反射,且高光反射颜色是彩色的。

  非金属的光线反射率和光线吸收率都较低,当入射角呈90°时,由于菲涅尔效应,几乎100%的光线会被反射出去;但当入射角呈0°时,只有2%~5%的光线会被反射出去,剩下的折射光线在被吸收一部分后形成漫反射。因此我们认为,非金属同时具有高光反射和漫反射,且高光反射是单色的。

 

读一读PBR的公式

  现在我们来读一读Disney的PBR公式吧~这些公式描述的都是模型表面的一个“点”与光线交互的结果,记住这一点会让阅读公式的旅途变得轻松愉悦。

3.1 总述

  首先,我们来定义一下与模型表面一点相关的各个变量。Disney的PBR模型是基于微面元理论的,因此光线与模型表面一点相交时,实际上是和一系列微面元交互的结果。微面元的法线记为m,模型表面一点的法线记为n,入射光线方向记为l,观察方向记为v,半程方向记为h(h将l和v的夹角分为均等的两半)。

  其次,我们来看一下描述模型表面一点的着色结果的方程,也即大名鼎鼎的渲染方程:

       其中,是自发光的强度;是入射光的强度,乘以点积项是因为入射光在不同方向有不同程度的衰减;就是BRDF,即反射光线的比例,那么就是反射光的强度,积分就是对所有入射光方向对应的反射光强度进行累加,得到的结果就是反射光的总强度。

       但是在渲染中完成积分操作是很困难的,因此我们通常用精确光源的渲染方程来简化这个过程,也即用一个特定方向的入射光信息来计算出射光信息。公式如下:

       其中,f(l,v)又可以被分为高光反射项(高光反射比例)和漫反射项(漫反射比例):

       那么接下来,我们就来详细聊聊Disney的高光反射项和漫反射项。

3.2 高光反射项

  Disney的高光反射项也被称为Cook-Torrance BRDF,具体形式如下:

       分母是矫正因子,分子由三项组成:F(l,h)代表菲涅尔项,描述有多少入射光会被直接反射出去,这个值和物体属性及入射光角度有关;D(h)代表法线分布项,描述有多少微面元的法线和半程方向重合,只有这些微面元上的反射光才会被观察到;G(l,v,h)代表阴影遮挡项,描述有多少微面元不会被其他微面元遮挡,只有这些微面元上的反射光才会被观察到。可以看到,FDG这三项的作用和第一部分中“光与物体的交互”的文字描述是一一对应的。

3.2.1 菲涅尔项

       F0指入射光角度为0时的直接反射光比例,这个值对每一种材质而言都有所不同,而一个模型上可能有多种材质,因此我们通常用一张纹理来记录F0,从而让使用者能更自如地控制它。需要注意的是,金属的F0较大且是彩色的,非金属的F0较小且是单色的,即如果用RGB三个通道来记录F0,那么金属的三个值通常是不一致的,而非金属的三个值通常是一致的。

       l·h的存在反映了菲涅尔反射效果。如果我们动手计算一下就能发现,当入射光角度为0时,这点的反射光比例为F0;当入射光角度为90°时,这点的反射光比例为1.

3.2.2 法线分布项

       这个公式乍一看,让人不知道它“为什么是这样的”。但正如前文所述,我们暂时没必要去探究这样的问题,而只需了解“它被哪些因素影响”,以及“如何影响”就可以了。

       在第一部分中我们已经讨论过,粗糙度决定了微表面法线m和表面法线n的不重合程度,而表面法线n和半程方向h的夹角则决定了反射光线的被接收程度。因此,D(h)应当随n·h的增加而增大,且当n·h接近1时随roughness增加而减小。如果我们动手计算一下就能发现,上述表达式是满足这个规律的,只是需要额外的操作来防止roughness为0时的高光消失现象。

3.2.3 阴影遮挡项

 

       可以看到,当入射角和观察角都呈0°时,G值为1,意味着不存在遮挡现象;当入射角和观察角都呈90°时,G值为0,意味着几乎所有反射光都被遮挡;且G值随着roughness的增大而减小。这些都符合我们对微表面理论的认知。

3.3 镜面反射项

 

  漫反射光线的比例首先受到菲涅尔效应的影响,其次和物体属性有很大关系,金属的漫反射占比接近0,而非金属的漫反射占比是一个三通道的值,因此使用纹理来控制该属性(baseColor)是很合理的设计。

3.4 光源的处理

  在处理直接光源时,我们只需要拿到光源们的颜色强度值,再按照精确光源的渲染方程计算并累加即可。而间接光源的处理通常需要依赖于IBL(Image-Based Lighting)技术。具体来说,我们可以在场景中设置一些反射探针,生成环境贴图,并使用粗糙度属性对它们进行LOD采样,这样就能实现粗糙表面对应模糊环境光照的效果。

 

谈一谈参数的来源

  PBR一般有两种工作流:金属/粗糙度(Metal/Roughness)工作流和高光/光泽度(Specular/Glossiness)工作流。两种工作流的内部实现通常会基于同一套物理模型,只是参数的来源有所不同。回顾前文可以发现,在计算模型表面一点的着色结果时,许多参数是由渲染引擎自动计算的,使用者只需设置少量的参数就可以实现丰富的材质效果,这也正是Disney PBR的魅力之一。渲染引擎无法直接获取的参数有:反映模型各点高光反射程度的F0、反映模型各点漫反射程度的baseColor、反映模型各点粗糙程度的roughness。两种工作流对这些参数做了不同的输入设计暴露给使用者,因此需要在渲染前先对使用者的输入进行不同的解码以得到正确的参数。

Fig.2. 两种PBR工作流

4.1 金属/粗糙度工作流

  对这种工作流而言,使用者需要提供三张纹理:基本色 (base color)、金属度 (metallic) 和粗糙度 (roughness)。

  基本色纹理是一张RGB纹理,它存储了两种数据:①金属材质的高光反射颜色②非金属材质的漫反射颜色。金属的漫反射颜色和非金属的高光反射颜色均不记录,因为前者几乎不存在,后者通常设为定值(变化范围很小)。

  金属度纹理是一张灰度图,它存储了材质是否为金属的信息。金属度纹理相当于一个遮罩,能告诉Shader如何去解读基本色纹理中不同区域的数据,比如,模型表面各点的高光反射颜色F0可以由非金属的定值高光颜色和基本色纹理的采样颜色线性插值而来,插值系数为金属度纹理的采样数值。同理也可结合基本色纹理和金属度纹理得到漫反射颜色baseColor.

  粗糙度纹理也是一张灰度图,存储了材质表面的粗糙度信息,采样后无需做任何处理就能得到roughness值。

4.2 高光/光泽度工作流

  对这种工作流而言,使用者需要提供三张纹理:漫反射(diffuse)、高光度(specular)和光泽度(glossiness)。这种工作流使用的参数和渲染引擎所需的参数有着很好的对应关系:漫反射纹理和高光度纹理都是RGB纹理,分别存储材质的漫反射颜色baseColor和高光反射颜色F0;光泽度纹理是一张灰度纹理,用1减去采样所得值就能得到粗糙度信息roughness。

  另外,为了保证能量守恒,在两种工作流中,漫反射颜色baseColor最终都会乘以一个系数oneMinusReflectivity,该系数表示除高光反射外的光线占比,通常用1-max(F0(R), F0(G), F0(B))计算而得。

posted @ 2021-04-14 11:08  rbcl  阅读(390)  评论(0)    收藏  举报