最近在学习SP的时候偶然间发现substance官方还有个学习网站,里面有不少干货文章。刚好我对PBR的原理一直有许多疑问,故转载过来研究一番。
才发现腾讯的一位大佬也翻译过,一起拿来研究研究。
又发现一位大神 浅墨 写的文章。

.

1.光线

光线在均匀的透明介质(如空气)中是沿直线传播的,在遇到不透明物体等表面,或者穿过不同的介质时(比如从空气到水里)是遵循一定规律的(见图1)。

图1 入射角,入射光线和反射光线

当光线照射到物体表面时,可能会发生以下两种情况:

  • 反射(Reflection),光线沿着反射角的方向远离物体表面。
  • 折射(Refraction),光线穿过物体表面进入内部,并仍以直线轨迹运行。

在物体表面,光线要么被反射,要么被折射,或者也可以被介质(Medium)吸收。但要注意的是, 在材质表面光线并不会被吸收。

.

2.吸收和散射 – 透明和半透明

当光线穿过不均匀介质或半透明材质时,可能会被吸收或散射:

当光线被吸收时,由于光的能量被转化成其他的形态(通常是热能),所以光线的强度也会相应减弱。同时,由于不同波长的光被吸收的情况不同,所以光的颜色也会改变,但是光线的方向不会发生变化。

当光线被散射时,光的方向可能会被随机改变,改变程度取决于材质本身,不过光的强度并不会被改变。在生活中,散射是一个很常见的现象,耳朵皮肤的透光就是一个很好的例子。因为耳朵很薄,所以我们可以看到光线会从耳朵背面穿透出来。

图2 耳朵背后散射出来的光线

当光线没有被散射且吸收也较弱时,光线可以直接穿透物质表面,例如透过玻璃,我们可以直接观察到另一侧的光线。再打个比方,如果在一个干净的游泳池里,当你在水中睁开眼睛时,一般可以直接看到较远处的池壁;相对的,如果游泳池很污浊,这些杂质粒子就会对光线进行散射,从而降低可视度。

其他光线碰到这种介质/材质,其吸收/散射的光线更多。介质的厚度在光线吸收和/或者散射过程中起着很重要的作用。可以使用厚度贴图来描述着色器里物体的厚度。

图3 厚度贴图常用于Substance Painter中子集表面的光线散射

.

3.漫反射和高光反射 – 微面元理论

高光反射 (Specular Reflection)是在介质表面反射的光线,之前在第一章讲光线的时候讨论过了。反射光线离开介质表面会以不同的方向运行,它遵循反射定律,该定律表明在平滑的表面上,反射角等于入射角。然后,大多表面是不规则的,反射光线的方向会根据介质表面的粗糙度而随机变化。虽然改变了光线的方向,但是光线的强度保持不变。

比较粗糙的介质表面会有较大的亮点,并且看起来比较暗。比较光滑的介质表面将会保持聚焦的高光反射,从适当的角度观察的时候,光线看起来会更亮更强烈,两种情况下的光线量是相同的。

图4 反射光线的方向会根据介质表面的粗糙度而随机变化

折射改变了光线的角度。当光从A介质穿透到B介质时,它的速度与方向会被改变。折射率(Index of Refraction, IOR) 是一个用来描述光线折射时角度变化的光学参数,它用于表示当光线在不同介质中穿透时,到底被折弯了多少(生活常例:吸管插在液体里的折射效果)。举个例子,水的折射率是1.33,而平板玻璃的折射率是1.52。

图5 吸管因为光线折射看起来是弯曲的

当光线从介质A穿透到介质B时,它会在B介质内撞击不同的粒子,并被多次散射,然后再重新折射穿出这个物体。二次折射回原介质的穿透点与首次折射时的位置大致相同。

图6 光线从介质A穿入介质B时,会在介质B内部发生散射

漫反射物质一般对光的吸收性很高,如果光线在这种物质里穿透太久,可能会被完全吸收掉。如果光线最终穿透了这个物质,也意味着其实它只穿透了很短的一段距离。

因此,在漫反射材质的渲染中,光线穿入点和穿出点之间的距离通常可以忽略不计。朗伯体(Lambertian Model,一种在着色渲染中用来展示标准漫反射的材质)就没有将表面粗糙计算在内。而其他漫反射光照模型,如Oren-Nayer Model,就有算上表面粗糙。

含有强散射和低吸收特性的材质通常被认为是中间媒介(Participating Media)或半透明材质(Translucent Materials),例如雾、牛奶、皮肤、玉器、大理石等。当渲染后三者时,通常会加入次表面散射(Substance Scattering)的光照模型,以保证渲染物理性质的精确性。这种情况下,光线的穿入点和穿出点(光线散射的距离)就需要被考虑到计算当中。当计算一些变化较大且低散射、低吸收的材质时(例如雾或烟),可能需要渲染成本更高的算法来执行,如蒙地卡罗模拟(Monte Carlo Simulations)。

微平面理论(Microfacet Theory)

理论上,当光线接触到一个不规则表面时,漫反射和高光反射会同时发生且与表面的粗糙度相关。然而在实践层面,由于散射发生在材质的内部,所以粗糙度对漫反射的可视影响并不明显。因此,光线二次穿透物体时的角度几乎不受表面粗糙度与入射角度影响,最普遍的漫反射光照模型——朗伯体就无视了表面粗糙。

在这个指南中,我们统一将表面不规则(Surface Irregularities)称为表面粗糙度(Surface Roughness)。表面不规则度还有根据不同的PBR流程会有好几个别称,包括粗糙度(Roughness)、平滑度(Smoothness)、光泽度(Glossiness)或微面(Micro-surface)。这些名词都是在描述同一个性质,就是材质表面的次纹理(Sub-texel)几何细节。

这些表面不规则信息会被记录在粗糙度贴图或光泽度贴图内。基于物理的双向反射分布函数(BRDF)也是在微面元理论上建立的,它认为一个大表面是由很多细小的含有多变方向的小平面组成的,这些小平面就叫做微面元(Microfacets),每一个微面元都基于单一法线方向来反射光线。

图7 基于物理的双向反射分布函数(BRDF)是建立在微面元理论上的

当微面元的表面法线方向正好是光线入射角与观察角的半角向量方向相同时,这个微面元就会反射可视光(在理论高光反射中,反射光线要进入观察者的眼中,必须要满足高光平面法向量正好与视线向量和入射向量的半角向量在一条直线上,见图8)。然而在某些情况下,并不是所有符合以上条件的微面元都会起作用,因为有些光线会被投影(光线方向)或遮蔽(观察方向)所阻挡。

图8 由于光线被散射,所以反射会变模糊

微观表面的不规则性会导致光线发生漫反射。模糊反射就是由于光被弥散式地反射所造成的,这些光线并没有被平行地反射回来,所以我们接收到的反射就是模糊的。

.

4.颜色

一个表面可被观察的颜色是由光源发射的波长所决定的。这些波长会被物体本身吸收,同时也会被高光反射或漫反射。那些经过吸收和分散后还留存的波长就是我们眼睛所看到的颜色。

举个例子,苹果的表皮大部分都反射红色光,是因为只有红光的波长在苹果皮表面被反向散射,其他光都被吸收了,所以我们看到的苹果是红的。

图9 苹果将红色波长反射到观察者的眼镜中

此外,苹果有着和光源颜色相同的非常明亮的高光,是因为苹果的材质本身具备非导体(电介质)特性(不对光的波粒进行传导),因此苹果表皮上的高光反射几乎与光的波长无关(具体可看下章)。对于这些材质,高光的颜色几乎从来不受物体表面颜色影响。

Substance PBR着色器一般使用GGX微面元分布(GGX Microfacet Distribution)。

.

5.双向反射分布函数(BRDF)

双向反射分布函数(BRDF,The Bidirectional Reflectance Distribution Function)是一个用于描述表面反射特性的函数。在计算机图形中,有着各式各样的BRDF模型,有些并非基于真实物理渲染的。而基于真实物理性质的BRDF,必须遵循能量守恒定律并且展现出互易律。互易律源自于亥姆霍兹互易原理(Helmholtz Reciprocity Principle), 这意味着,进入的光线和返回的光线可以理解成是可以彼此互易的,这并不会影响BRDF的最终推演结果。

Substance PBR着色器使用的BRDF模型是基于迪士尼制定的反射模型建立的。同时,这个模型也基于GGX微面元分布特性。GGX为高光反射提供了更为优质的解决方案:表现为更窄小的高光峰值点,以及更长的衰减弥散,这让材质的高光看起来更加的真实。

图10 GGX与Blinn高光反射分布 – GGX为高光反射提供了较好的解决方案

.

6.能量守恒

能量守恒在PBR渲染中是非常重要的前提。这个守则认为一个表面二次发射(反射或散射)的光必须少于这个表面接收到的光。对于艺术家或设计师来说,我们不必担心如何去控制能量守恒,因为PBR着色器的设定一般都自行符合能量守恒定律。

.

7.菲涅尔效应 – F0

菲涅尔项(Fresnel Item)作为BRDF的一项系数,在PBR着色中扮演着非常重要的作用。法国物理学家菲涅尔认为,一个表面反射的光的总量与观察光的角度相关。打个比方,如果你在观察一缸水,并且从它的正上方看下去(与水面垂直),就可以直接看到水池的底部,因为此时观察的角度为0°,视角向量与水面的法线向量重合。当你从更斜的角度去观察水面,并慢慢与水面趋于平行时,你会看见越来越多高光反射。

菲涅尔项通常不是我们可以在传统着色器中控制的属性,它一般只能由PBR着色器自行控制。当我们从掠射角(Grazing Angle 切线角/掠射角)观察所有光滑表面时,它们在与光线入射角成90°的位置几乎会形成100%的反光(当我们使用菲涅尔效果时,通常能观察到材质球边缘会出现一圈强反光)。

对于粗糙的表面,反射会更加地明显,但不会完全达到100%高光反射。这种情况下,反射的效果受每个微面元的法线与光的角度影响,而非取决于整个宏观面的法线与光的角度。表面粗糙时,光线被微面元进行不同角度的弥散反射,所以整个反射效果看起来会更加柔和。

F0:0度菲涅尔反射

当光线垂直地(与法线角度夹角为0)射在一个平面上时,一定比例的光会被高光反射。用折射率(IOR,Index of Refraction)去测算,我们就可以得到被反射的光的数量。这个值我们记为F0, 而光折射进材质表面内部的数量,我们记为1-F0(如图11示)。

图11 GGX和Blinn高光反射分布对比:GGX为高光反射提供了一种更优的解决方案

对于普遍非导体(电介质)材质来说,它们的F0范围在0.02-0.05之间(Linear Space)。对于导体材质来说,F0范围大概为0.5-1.0。一个表面的反射率受它的折射率影响,可以由以下公式求得:

F0反射值也影响着我们应该如何制作材质贴图。非金属材质(绝缘体)使用灰阶表示反射数值,而金属材质(导电体)则使用RGB数值。基于PBR与艺术设计对反射的理解,我们可以预设普遍的光滑的非导体(电介质)表面,F0会反射2%-5%的光线,在切线角反射100%的光线。

非导体(电介质)表面的F0反射值一般区别不大,事实上,当我们改变表面粗糙度时,这种反射值的变化也很难被看见。然而,不同材质之间还是有一定区别,图12展示出F0在金属与非金属表面上的范围。需要注意的是,宝石类的材质可能是个特例,因为它们的F0值更高。

.

8.导体和绝缘体 – 金属和非金属

我们为PBR制作材质时,应当时常考虑该材质是金属还是非金属,因为它们的制作规范完全不同。

尽管对部分类金属材质(Metalloid,非金属与金属的混合材质)来说,分类很难被明确,但是对大多数制作材质的工作流而言,事先分清楚材质是否为金属仍然是一个较好的方法。本文将会对金属与非金属的特性进行拆解,并分别讲述它们的制作规范。

图12 金属及非金属的F0值范围

在作为导体的金属材质中,由于折射光被吸收,所以金属的颜色来自于反射光线。因此,在贴图中并不会赋予金属漫反射颜色(Diffuse Color)。

金属 Metals

金属是热和电的优良导体。导电金属的电场是零,而当带有电场与磁场的入射光波打在金属表面上时,光波会被部分反射,而所有的折射光波都会被吸收。被抛光过的金属的反射值范围较高,一般在70%-100%之间。

图13 金属的高光反射率大致在70-100之间

不同的金属吸收光不同的波长,由于折射光线被吸收,金属的色泽/色调来自于反射光。举个例子,黄金会吸收可视光谱高频段的蓝光,所以它看起来是黄色的。

在贴图中,我们不会给金属赋予漫反射颜色(Diffuse Color,这也就是我们平常在金属材质中添加颜色会无效的原因)。举个例子,在Specular/Glossiness的工作流中,金属在Diffuse Map一般会设为黑色,而反射值通常记录在Specular通道里带有色调的色值中。(对于金属材质来说,反射值会用RGB来记录,而且会拥有色调。)由于我们在PBR环境中工作,所以需要使用真实世界的规律、数值与方法在贴图中还原金属的反射。

对于金属来说,另一个影响材质的因素就是它们被腐蚀的程度,也就是说,造成腐蚀的因素可能会对金属的反射状态造成比较明显的影响。在金属贴图中,被腐蚀的区域会被标记为黑色,并被认定为非导体(电介质)材质。Metallic/Roughness工作流的着色器会将这些腐蚀区域的F0值统一设定为4%。

图14 金属被腐蚀的区域会被理解为电解质,并且带入反射率为4%的F0值

另外,上漆的金属一般也会被认作是非导体(电介质)材质,色漆会被认为是覆盖在原金属之上的一层材质,只有那些没被油漆覆盖到的金属才会被定义为原始金属。同样的原理也应用在被尘埃或其他物质覆盖的金属材质上。

正如本章一开始提到,在制作PBR材质前一定要先想清楚材质是否为金属。甚至为了更精确的材质效果,设计师应该明确金属材质的状态:是否有上漆、被腐蚀、或者被尘埃、油等其他物质覆盖。如果材质某部分区域的贴图显示它不是金属,该区域会被着色器理解为非导体(电介质)材质。特别需要留意的是,腐蚀效果一般都会有一些介乎金属与非金属之间的混合状态(金属贴图可能呈现出不同层次的灰阶)。

非金属 Non-Metals

非金属(非导体/绝缘体/电介质,为设计师直观理解,下文统称为非导体)是较差的电导体。材质内被折射的光一般会被散射或者同时被吸收(通常会穿透物体二次折射)。对比起金属,他们会反射更少的光并且拥有反照率颜色(*Albedo Color,需要注意的是Diffuse、Albedo、Base Color是在不同工作流的名称,它们作为贴图时所携带的RGB属性有着相似的适用原则,但是所携带的信息在本质上并不完全一致。广义上,Albedo包括了Base Color和Diffuse)。

之前也有提到基于折射率计算,对于普遍的非导体(电介质)材质来说,F0反射率大概在2-5%左右。这些值的转换回线性空间大概是0.017-0.067之间(40-75 sRGB)。除了部分比较特殊的非金属材质(如宝石)之外,绝大多是非导体材质的F0值都不会超过4%。

就像金属材质一样,对于非金属材质,我们也需要使用真实世界测量的数值来绘制。但是我们很难去获得各种非透明材质的折射率(IOR)。不过,非金属材质的F0值变化不会很大,所以我们可以为反射值制作一个参考的维度(如图15)。

图15 本图使用Gamma2.2对sRGB到线性空间进行近似转换-具体请参考线性空间渲染章节

.

9.线性空间渲染

在着色器中,色值的提取与色彩的计算操作都是在线性空间(Linear)中执行的。这个流程会先把色彩贴图中已经被gamma-encoded(一般是sRGB)的值转成Linear。

在色彩管理的流程中,一般会由程序自动或工程师手动标记好这张贴图的色彩空间以便后面正确的计算。所有的计算与渲染会在线性空间中进行,在最终显示器显示前,再被gamma-correction矫正回sRGB,以保证色彩的正确显示。

那么要如何知道哪个图会被解码回Linear呢?如果设计师是从Substance Painter或Substance Designer中直出贴图的话,我们可以看哪些贴图中含有颜色(Diffuse Reflected Color),例如金属色调或者是玻璃色调。这些贴图在输入着色器前就应该被标记好它原有的色彩空间(通常是sRGB,因为设计师一般也是在此环境中将贴图绘制出来的)。

因此,在PBR渲染流程中会标记为gamma-encoded的贴图包括Base Color(基础颜色/反照率颜色)、Diffuse(漫反射)、Specular(高光反射)、Emissive(发光贴图)。

而当贴图仅用于记录数据时(材质粗糙度,是否为金属等),它们通常都会被输出为Linear。在PBR渲染流程中被标记为Linear的贴图有Roughness(粗糙度),Ambient Occlusion(AO)、Normal(法线)、Metallic (金属)、Height (高度)等。

当我们使用SP或SD设计贴图,并输出Substance材质时,一般不用担心Linear与sRGB的转换,因为这套输入输出的流程已经被自动化处理,所以最终渲染显示的结果也是被gamma矫正后的正确效果。

同样,在Substance Integration插件中使用Substance材质时,输出结果已经根据贴图的色彩空间(线性或sRGB)、以及所在程序的色彩管理设置进行自动转换。然而需要注意的是,理解这套流程背后的原理仍然很重要,因为当Substance材质贴图(Substance Map)作为普通位图(Bitmap)使用时,你仍需要根据你使用的渲染器来手动标记贴图的色彩空间。通常,后缀为.png, .jpg, .tga, .tif的贴图,gamma-encoded使用的是sRGB色彩空间;而.exr为后缀的贴图(如环境发光贴图HDRI)则为Linear空间。

.

10.PBR的核心特征

微平面理论(Microfacet Theory)。微平面理论是将物体表面建模成做无数微观尺度上有随机朝向的理想镜面反射的小平面(microfacet)的理论。在实际的PBR 工作流中,这种物体表面的不规则性用粗糙度贴图或者高光度贴图来表示。

能量守恒(Energy Conservation)。出射光线的能量永远不能大于入射光线的能量。随着粗糙度的上升镜面反射区域的面积会增加,作为平衡,镜面反射区域的平均亮度则会下降。

菲涅尔反射(Fresnel Reflection)。光线以不同角度入射会有不同的反射率。相同的入射角度,不同的物质也会有不同的反射率。万物皆有菲涅尔反射。F0是即0度角入射的菲涅尔反射值。大多数非金属的F0范围是0.02~0.04,大多数金属的F0范围是0.7~1.0。

线性空间光照(Linear Space Lighting)。所有含色彩信息的贴图(如Base Color)通常都会被着色器转换成Linear用于计算。设计师或开发者需要注意这个转换是否由渲染引擎在引入贴图时自动执行,如果没有,则需要手动标记贴图的色彩空间。当贴图仅用于记录材质的属性数值(如粗糙度、发光度、高度、法线等),则该贴图在整个流程中都应该被解析为Linear空间。

色调映射(Tone Mapping)。也称色调复制(Tone Reproduction),在图形学中,表示以感知上令人信服的方式将HDR场景的强度值转换为显示强度的过程,也可以理解为将宽范围的光照级别拟合到屏幕有限色域内的过程。通常,由于通过HDR渲染出来的亮度值会超过显示器能够显示最大亮度,所以需要结合色调映射(Tone Mapping),将光照结果从HDR转换为显示器能够正常显示的LDR。

基于真实世界测量的材质参数(Real-World Measurement Based Substance Properties) 。PBR的正统材质参数往往都基于真实世界测量。真实世界中的物质可分为三大类:绝缘体(Insulators),半导体(semiconductors)和导体(conductors)。在渲染和游戏领域,我们一般只对其中的两个感兴趣:导体(金属)和绝缘体(电解质,非金属)。菲涅尔反射率代表材质的镜面反射颜色与强度,是真实世界材质的核心测量数值。其中非金属具有非彩色的镜面反射颜色,而金属具有彩色的镜面反射颜色,即非金属的F0是一个float,金属的F0是一个float3。

 

参考:
https://academy.substance3d.com/courses/the-pbr-guide-part-1
https://isux.tencent.com/articles/THE-PBR-GUIDE-1.html
https://github.com/QianMo/PBR-White-Paper