“光”是一个复杂的现象,具有波粒二象性。也因此,有许多不同的“光照模型”被创造出用来描述光的行为。
“光照模型”用于描述光是如何与物质进行交互的。作为制作纹理的美术,我们尤其感兴趣光是如何与物质表面进行交互的,因为我们的工作就是创建用于描述表面的纹理。我们所创作的纹理和材质,在虚拟世界里和光进行交互。因此,我们对光的行为理解越深,我们创作的贴图看起来就越好。
在这篇指南里,我们会讨论PBR(Physically Based Rendering,基于物理的渲染)背后的理论。我们将从研究光线的行为开始,随后逐步确定PBR的关键特性。
目录
光线
光的射线模型指出:光线在均匀的透明介质(例如空气)中具有直线的轨迹。光的射线模型还指出:光在遇到不透明表面时,或者从不同的介质中穿过(例如从空气到水)时,光线的行为是可预测的。
因此,光线从一个起点到终点(终点通常是光被转换成了另一种形式如热量)时,其路径可以被可视化。
一条射向表面的光线被称为“入射光”,而形成的角度就是“入射角”
当光线射到两种不同的介质之间的交界面上时,以下一种或两种事件会发生:
- 光线反射到另一个方向上,遵循反射定律,即入射角等于反射角。(反射光线)
- 光线从一个介质穿到另一种介质中,并延直线传播。(折射光线)
也就是说,光线在到达物质表面上的一点之后,要么被反射,要么被折射。当然,光线最终还是会被某种介质吸收掉的,但是“吸收”并非是发生在光线到达物体表面的这一点上。
吸收和散射
当光在非均匀的介质中,或者半透明的材质中传播时,会发生“吸收”和“散射”现象:
- 当光被吸收时,光的强度会减弱,因为它转变为了另一种能量——通常是热量。它的颜色会发生变化——这取决于各个波长的光被吸收的量。但光线的方向不会变。
- 当光被散射时,光线的方向会随机地改变,随机的分布取决于材质。散射会随机改变光线的方向,但是不会改变光的强度。“耳朵”是观察这种现象的好例子,如下图所示,耳朵的厚度比较薄(也就是说吸收光的量比较少),所以你可以看到从耳朵背面散射出来的光线。
如果光没有发生散射而且吸收的量较少,光线就可以直接穿过表面,“玻璃”就是这种情况。例如,想象你在一个干净的池子中游泳,睁开眼睛,透过清澈的水你可以看到很远的距离。然而,如果同一个水池中水是比较脏的,那么污垢颗粒就会散射光线并降低水的清澈度,结果,可视距离就会减少。
光线在这样的介质/材质中传播得越远,被吸收和/或散射的光就越多。因此,在“有多少光被吸收和散射”这个问题上,物体的厚度将扮演一个重要的角色。所以,“厚度图”(Thickness Map)可以被用来向Shader描述物体的厚度。下图是Substance Painter中在子表面散射中使用厚度图的效果:
漫反射和高光反射
高光反射指的是光线在表面的反射(正如我们之前部分所讨论的)。光线从表面反射出去,并沿不同的方向传播。 它遵循反射定律,该定律指出:在理想平面上,反射角等于入射角。 但是,大多数表面是不规则的,反射方向会由于表面粗糙而发生随机变化。 这会改变光的方向,但是光的强度保持不变。
较粗糙表面的高光部分将较大且较暗。 较光滑表面的反射更集中,从合适的角度观察时,它们的高光部分将较亮且强烈。 不过在这两种情况下,反射光的总量是相同的:
折射会让光线方向发生变化。 当光从一种介质传播到另一种介质时,它会改变速度和方向。IOR(index of refraction,折射率)是光学测量数据,它描述了光线传播方向的变化。 实质上,使用IOR值可以计算出光线穿过一种介质到达另一种介质时将“弯曲”多少。 例如,水的IOR为1.33,而平板玻璃的IOR为1.52。 在下图中,你可以看到放置在一杯水中的吸管的渲染。 当光线通过不同的介质(空气,水和玻璃)时,由于折射,吸管看起来会弯曲:
漫反射其实是已折射的光。光在从一种介质到达另一种介质时,我们假设它进入了这个物体。然后,光在该物体内多次散射。最后,它再次从物体中折射出来,并在和最初进入点大致相同的位置返回原先的介质:
漫反射的材质是具有“吸收性”的,如果光在这个介质中“走”了太久,则它可能会被完全吸收掉。因此,那些可以离开这个材质的光线,很大可能只“走”了离入口点很近的距离。
所以,光线的输入点和输出点之间的距离,有时是可以被忽略不计。Lambertian模型是传统的用来计算漫反射的模型,但是它并没有考虑表面的粗糙度。不过也有考虑粗糙度的漫反射模型,比如Oren-Nayar模型。
具有“高散射”、“低吸收”的材质,有时被称为“参与介质”( participating media)或者说“半透明材质”。例如:烟,牛奶,皮肤,翡翠和大理石。对于后三者的渲染,可以使用额外的“子表面散射”模型来实现,此时光线的输入点和输出点之间的距离差异将不能忽略不计了。而要想精确渲染烟雾这种,散射和吸收都很低,且程度变化很大的介质,则就需要性能更昂贵的方法了,例如蒙特卡洛随机模拟。
微面元理论
从理论上讲,当光线与表面相交时,漫反射和镜面反射都被表面的不规则性所决定。 但实际上,由于光线在物体内部发生散射,因此粗糙度对漫反射的影响不太明显。 结果相当于:光线射出的方向与表面粗糙度和入射方向都无关了。 最常见的漫反射模型Lambertian就完全忽略了粗糙度。
在本指南中,我们将表面的“不规则性”表示为“粗糙度”。 根据使用的PBR工作流程,表面不规则性也可以有多种名称,包括粗糙度(roughness),光滑度(smoothness),光泽度(glossiness)或微表面(micro-surface)。 所有这些术语都描述了表面的同一个方面:亚像素几何细节(sub-texel geometric detail)。
基于物理的BRDF(双向反射分布函数)是基于“微面元理论”的。该理论认为一个平面在微观上是由数个方向各异的微小平面组成,称为“微面元”(microfacets)。每一个微面元都基于其各自的法线朝向来反射各自接收的光线:
只有那些法线朝向正好位于入射光和视线中间方向的微面元,才能反射出你可以看到的光线,因为此时反射光线和视线一致。不过,并不是说所有具有此法线朝向的微面元都是如此,因为入射光线可能被遮挡(即阴影),视线也可能被遮挡。
是表面在微观上的不规则性,导致了光的散射。具体来说,“模糊”的反射就是因为光线的散射:由于光并没有被平行地反射出去,所以我们感觉高光反射像是被模糊了。
颜色
一个表面的颜色,取决于其发出光的波长。当不同波长的光被物体吸收,所剩下被高光反射与漫反射的光的波长就是我们看到的颜色。
例如,苹果的表面大部分是红色的,是因为只有红光被散射出去了,其他颜色的光都被吸收了:
不过,苹果也会有和光源颜色一样的高光部分,因为苹果皮的材质是不导电的(绝缘体),对于这些材质,高光反射几乎和波长无关,也因此没有颜色。我们将会在随后讨论不同的材质(“金属”和“绝缘体”)。
BRDF
BRDF(Bidirectional Reflectance Distribution Function,双向反射分布函数)描述了表面的反射相关的属性。在计算机图形学中,存在不同的BRDF模型,其中一些是不符合物理的。
一个符合物理的BRDF,它必须是“能量守恒互惠”(energy conserving and exhibit reciprocity)的。其中“互惠”(reciprocity)指的是“亥姆霍茨互惠原理”(Helmholtz Reciprocity Principle),它指出入射光线和反射光线可以被认为是互相颠倒的,并不影响BRDF的结果。
Substance的PBR着色器使用的BRDF是基于 “迪士尼的原理反射模型”(Disney’s principled reflectance model.)。 该模型基于 GGX微面元分布。在高光反射的分布方面,GGX提供了更好的方案:在高光的峰值较短,在衰减时有更长的尾段,这样看起来更逼真。
能量守恒定律
在基于物理的渲染中,能量守恒定律扮演着一个必不可少的角色。这个定律表明:从表面重新发出的光(指反射和散射)的总量,总是比接收到的光的总量少。但作为一个美术,我们是不需要担心能量守恒定律的——我们不需要基于这个定律去手动控制什么参数。这就是PBR的优势之一:着色器算法保证计算的结果一定是符合能量守恒定律的,这样美术就可以专注于艺术而非物理学定律了。
菲涅尔效应
在基于物理的渲染中,菲涅尔反射系数作为BRDF的系数也起着至关重要的作用。菲涅耳效应是法国物理学家奥古斯丁·让·菲涅尔(Augustin-Jean Fresnel)观察到的,这个效应指出:从表面反射的光量取决于观察它的角度。
想象一个水池:如果你的视线垂直于水面,则可以看到池底。如果你的视线接*行于水面,你就会感到更强烈的高光反射,可能根本看不到水下的东西。
在PBR中,我们不需要控制菲涅尔效应相关的系数。这同样也是PBR着色器算法本身所负责处理的。当以一个平行表面的角度来观察时,所有光滑的表面在90°视角(即视线和表面法线呈90°)时都会有100%的反射率。
而对于粗糙的表面,反射率也会增大,但不会接近100%反射率。 这里最重要的因素是每个 “微面元” 的法线和光之间的角度,而不是 “宏观表面” 的法线和光之间的角度。 由于光线沿不同方向分散,因此反射显得更“柔和”或者说“暗淡”。在宏观级别上的菲涅尔效应,可以说是集体微观面元上所有菲涅尔效应的平均值。
F0(0度时的菲涅尔反射率)
当光线垂直于表面(即0°入射角)时,有一定比例的光线会作为高光被反射。使用表面的IOR(index of refraction,折射率)可以得出反射的量。这被称为F0
(Fresnel zero),而被折射到介质表面内的的量就是1 - F0
。
对于常见的拥有光滑表面的绝缘体,F0
在2%
到5%
之间,即反射的光在这个角度有2%
到5%
的量,而在视线平行于表面的角度则会反射100%
的光:
对于常见的绝缘体,F0
的数值范围是0.02
~ 0.005
。而对于导体(金属),F0
的值范围是0.5
~ 1.0
。因此,表面的反射率由折射率决定,如以下方程式所示(Lagarde 2011):
F
(
0
°
)
=
(
n
−
1
)
2
(
n
+
1
)
2
=
0.02
F(0°) = \frac{(n-1)^2}{(n+1)^2}=0.02
F(0°)=(n+1)2(n−1)2=0.02
在创作纹理时,我们要关注F0
。 非金属(绝缘体)将具有灰度值,金属(导体)将具有RGB值。
绝缘体(非金属)的反射率不会变化很大。受粗糙度影响时,实际的变化很难观察到。不过,这些值中有所差别。在之后的图中显示了金属和非金属材料的F0
范围。
虽说非金属的反射率不会变化很大,但是“宝石”是个例外——它们的F0
值很高。我们会在随后继续讨论F0
,因为它和“导体”与“绝缘体”关系很大。
导体和绝缘体(金属和非金属)
当创建PBR材质的时候,从金属和非金属的角度来思考是很有帮助的。首先判断物体表面是金属还是非金属。根据答案的不同,你将会遵循不同的准则。
这样的判断可能过于简单了,因为某些材料可能两类都不属于,比如“准金属”(metalloids,金属和非金属的混合物)。但总体来说,在创建材质的时候,区分金属和非金属是一种好方法。
为了制定材质的制作准则,我们首先要理解我们所创造的是什么。就PBR而言,我们可以查看金属(导体)和非金属(绝缘体)的属性如下图:
金属
金属是“电”的良导体(也是“热”的良导体)。 导电金属中的电场为零。光波是由电场或磁场形成的,当光到达表面的时候,部分被反射,而被折射的光将全部被吸收。抛光金属的反射率值很高,约为70%~100%。
一些金属吸收不同波长的光。 例如,“金”在可见光谱的高频段吸收蓝光,因此它显示为黄色。 由于折射光被全部吸收了,因此金属的颜色完全来自于反射光。所以在我们的纹理贴图中,我们不会为金属赋予漫反射的颜色。 在“镜面反射/光泽度”(specular/gloss)工作流中,原始金属在漫反射图中设置为黑色,而反射率值在SpecularMap中是颜色值。 对于金属,反射率值为RGB。 由于我们使用的是PBR模型,我们需要在金属反射率的纹理贴图中使用真实的测量值。
从纹理上讲,金属另一个重要的方面是其腐蚀的趋势。 这意味着“风化因素”(weathering elements)可以在金属的反射状态中扮演重要角色。 如果金属生锈,则金属的反射状态会发生改变。 然后腐蚀的区域将变为绝缘体,如下图所示,它们在金属图(metallic map)中将表示为黑色:
正如我们将在第2部分中讨论的那样,“金属/粗糙度”工作流中的着色器将绝缘体的F0
值硬编码为4%
。上图中,基础颜色图中生锈部分表示的是反射出光的颜色,而他的F0
值实际上是硬编码的4%
(和金属不同,基础颜色图中的值代表F0
)。
另外,涂漆的金属被视为绝缘体而不是金属。 涂漆相当于覆盖在原始金属之上的一层。 只有当涂漆中剥落,暴露出来的原始金属才可视为金属。 同理,金属上的污垢或任何会遮盖原始金属的物质也是如此。
正如此部分开头所述,创建PBR材质时判断物体表面是金属还是非金属是很有帮助的。 更准确地说,该问题还应包括有关金属状态的信息:金属是否被涂漆,生锈或被其他物质(如灰尘或油脂)覆盖。 如果该材料不是原始金属,则将被视为绝缘体。由于不同程度的风化,金属和非金属之间可能会有不同程度的混合,因此说金属的反射状态被风化因素所影响。
非金属
非金属(绝缘体)是不良的导体。 折射的光被散射和/或吸收,因此它们反射的光量比金属少得多,并具有颜色。
前面我们已经说过,普通的绝缘体的F0
约为2-5%
。 这些值包含在0.017-0.067(40-75 sRGB)的线性范围内,如下图所示。除了个别的非金属材料(例如宝石)之外,大多数绝缘体的F0
值都不会大于4%
。
常见绝缘体的F0
值都在大约2-5%
,这是基于IOR计算出来的。你可以在上图中看到这个范围。
与金属一样,我们需要使用现实世界的测量值,但对于那些并非半透明的材质,我们很难测量其IOR。 但另一方面,最常见的绝缘体材质之间IOR值不会变化太多,因此我们可以为反射率值使用一些准则。 我们将在本指南的后面介绍它们。
线性空间渲染
“线性空间渲染”是一个比较复杂的主题。对于此指南,我们将采用一种简单化的方法来说明:线性空间渲染为光照计算提供了正确的数学方法。 它创建了一个环境,让光以一种可信的真实世界的方式进行交互。
对于线性空间渲染的讨论,我们必须介绍伽玛校正的概念。在对图像进行编码以进行显示和存储时,伽马校正是一种优化步骤,它减少了带宽和比特分配。 此过程利用了人眼对亮度感知的理论,该理论指出人眼感知大致遵循亮度的立方根。
相对于较亮的部分,人类视觉系统对较暗的部分更敏感。 因此,不使用伽马校正会造成浪费——因为太多的比特被分配给人类视觉系统无法区分的区域。
在传统的数字图像创建过程中,图像将使用一个伽马函数来编码,例如 sRGB OTEF(Opto-Electronic Transfer Function),或者说1/2.2
的伽马值,以呈现在显示设备上。然后,显示设备电路使用自己的解码伽马函数EOTF(Electro-Optical Transfer Function)来解码图像。显示器的伽马设置通常为2.2
。
从本质上讲,“线性颜色空间”没有伽马校正,等于说伽马系数为1.0
,这产生了正确的线性计算。但是,为了能将渲染出的图像正确呈现给观察者,还需要将其编码到伽马空间中。
颜色值的计算,和后续操纵,都在线性空间中执行。 该过程将贴图中的颜色值从伽马编码值转换为线性的编码值。 此过程通常涉及对纹理贴图进行标记来指出如何解释纹理数据:“线性”、“sRGB OETF”、“gamma = 1/2.2”。随后计算在线性空间中执行,最终渲染结果使用“sRGB OETF”或“gamma = 1/2.2”进行伽马编码。
在Substance Painter或Substance Designer中,有简单的方法来判断哪些纹理贴图是编码的:
- 如果是代表人眼看到的“颜色”,例如一个金属的颜色或草地的绿色,那么就应该标记为“伽马编码”。这些贴图包括:“基础色(base color)”、“漫反射(diffuse)”、“高光反射(specular)”、“自发光颜色(emissive)”。
- 如果代表的是一种“数据”,比如表面粗糙的程度,那么就应该标记为“线性值”。这些贴图包括:“粗糙度(roughness)”、“环境光遮挡(ambient occlusion)”、“法线方向(normal)”、“金属度(metallic)”、“高度(height)”。
在Substance Designer和Substance Painter中,着色器输入的线性空间和伽马空间之间的转换是自动处理的。 渲染视口中的计算结果的伽马校正也是如此。 作为美术,我们通常无需担心Substance软件中的线性计算和转换,因为软件默认情况下会自动处理。
当通过集成到其他应用程序的Substance插件来使用Substance材质时,输出纹理贴图会被插件进行自动标记给主体应用程序。然而,理解这个过程是重要的:当Substance的贴图是作为独立的图片而非Substance材质时,你可能需要对纹理贴图进行手动的标记,指明其为“伽玛编码”或“线性”,这取决于你所使用的渲染器是什么。通常,.png,.jpg,.tga或.tif文件是伽玛编码的,而sRGB OETF和.exr文件是线性的。
从伽玛空间转换为线性空间的sRGB解码函数(EOTF)在Substance Painter和Substance Designer中使用,并由IEC 61966-2-1:1999标准定义如下:
C
l
i
n
=
{
C
s
r
g
b
12.92
if
C
s
r
g
b
⩽
0.04045
(
C
s
r
g
b
+
0.055
1.055
)
2.4
otherwise
C_{lin} = \begin{cases} \frac{C_{srgb}}{12.92} & \text{if } C_{srgb}\leqslant 0.04045\\ {(\frac{C_{srgb}+0.055}{1.055})}^{2.4}& \text{otherwise } \end{cases}
Clin={12.92Csrgb(1.055Csrgb+0.055)2.4if Csrgb⩽0.04045otherwise
*在写当前文档的时候,Substance Designer中 “线性到rgb”和“rgb到线性”节点由于优化的原因并不使用这个公式,这可能会在未来版本中改变。
为了简单起见,对于本指南中的所有转换,我们改用了以下简化(但近似)的转换函数:
C
l
i
n
=
(
C
s
r
g
b
)
2.2
C_{lin} =(C_{srgb})^{2.2}
Clin=(Csrgb)2.2
PBR的主要特征
现在我们已经研究了PBR背后的物理理论,可以推导出PBR的一些主要特征了:
- 能量守恒定律。 表面反射的光线永远不会比接收的光线明亮。着色器的算法将会确保计算一定会满足这个定律。
- 菲涅耳效应。 BRDF也由着色器处理。
F0
对于大多数常见的绝缘体而言的变化很小,在2%到5%的范围内。 而金属的F0
值很高,范围在70-100%之间。 - 高光反射的强度通过“BRDF”、“粗糙度贴图/光泽度贴图”和
F0
来控制。 - 光照计算在线性空间中进行。 着色器通常会将所有具有伽玛编码值(例如基础颜色或漫反射)的贴图转换为线性,但是在将图像导入游戏引擎或渲染器中时,可能需要检查相应的选项,以确保正确处理了转换 。而代表“数值”的贴图(例如粗糙度,光泽度,金属和高度)应设置为“线性”。