“光”是一个复杂的现象,具有波粒二象性。也因此,有许多不同的“光照模型”被创造出用来描述光的行为。

“光照模型”用于描述光是如何与物质进行交互的。作为制作纹理的美术,我们尤其感兴趣光是如何与物质表面进行交互的,因为我们的工作就是创建用于描述表面的纹理。我们所创作的纹理和材质,在虚拟世界里和光进行交互。因此,我们对光的行为理解越深,我们创作的贴图看起来就越好。

在这篇指南里,我们会讨论PBR(Physically Based Rendering,基于物理的渲染)背后的理论。我们将从研究光线的行为开始,随后逐步确定PBR的关键特性。

目录

  • 光线
  • 吸收和散射
  • 漫反射和高光反射
  • 微面元理论
  • 颜色
  • BRDF
  • 能量守恒定律
  • 菲涅尔效应
    • F0(0度时的菲涅尔反射率)
  • 导体和绝缘体(金属和非金属)
    • 金属
    • 非金属
  • 线性空间渲染
  • PBR的主要特征

光线

光的射线模型指出:光线在均匀的透明介质(例如空气)中具有直线的轨迹。光的射线模型还指出:光在遇到不透明表面时,或者从不同的介质中穿过(例如从空气到水)时,光线的行为是可预测的。

因此,光线从一个起点到终点(终点通常是光被转换成了另一种形式如热量)时,其路径可以被可视化。

一条射向表面的光线被称为“入射光”,而形成的角度就是“入射角”

当光线射到两种不同的介质之间的交界面上时,以下一种或两种事件会发生:

  • 光线反射到另一个方向上,遵循反射定律,即入射角等于反射角。(反射光线)
  • 光线从一个介质穿到另一种介质中,并延直线传播。(折射光线)

也就是说,光线在到达物质表面上的一点之后,要么被反射,要么被折射。当然,光线最终还是会被某种介质吸收掉的,但是“吸收”并非是发生在光线到达物体表面的这一点上。

吸收和散射

当光在非均匀的介质中,或者半透明的材质中传播时,会发生“吸收”和“散射”现象:

  • 当光被吸收时,光的强度会减弱,因为它转变为了另一种能量——通常是热量。它的颜色会发生变化——这取决于各个波长的光被吸收的量。但光线的方向不会变。
  • 当光被散射时,光线的方向会随机地改变,随机的分布取决于材质。散射会随机改变光线的方向,但是不会改变光的强度。“耳朵”是观察这种现象的好例子,如下图所示,耳朵的厚度比较薄(也就是说吸收光的量比较少),所以你可以看到从耳朵背面散射出来的光线。


如果光没有发生散射而且吸收的量较少,光线就可以直接穿过表面,“玻璃”就是这种情况。例如,想象你在一个干净的池子中游泳,睁开眼睛,透过清澈的水你可以看到很远的距离。然而,如果同一个水池中水是比较脏的,那么污垢颗粒就会散射光线并降低水的清澈度,结果,可视距离就会减少。

光线在这样的介质/材质中传播得越远,被吸收和/或散射的光就越多。因此,在“有多少光被吸收和散射”这个问题上,物体的厚度将扮演一个重要的角色。所以,“厚度图”(Thickness Map)可以被用来向Shader描述物体的厚度。下图是Substance Painter中在子表面散射中使用厚度图的效果:

漫反射和高光反射

高光反射指的是光线在表面的反射(正如我们之前部分所讨论的)。光线从表面反射出去,并沿不同的方向传播。 它遵循反射定律,该定律指出:在理想平面上,反射角等于入射角。 但是,大多数表面是不规则的,反射方向会由于表面粗糙而发生随机变化。 这会改变光的方向,但是光的强度保持不变。

较粗糙表面的高光部分将较大且较暗。 较光滑表面的反射更集中,从合适的角度观察时,它们的高光部分将较亮且强烈。 不过在这两种情况下,反射光的总量是相同的:

折射会让光线方向发生变化。 当光从一种介质传播到另一种介质时,它会改变速度和方向。IORindex 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

对于常见的拥有光滑表面的绝缘体,F02%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.02F(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标准定义如下:
Clin={Csrgb12.92if Csrgb⩽0.04045(Csrgb+0.0551.055)2.4otherwise 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.4​if Csrgb​⩽0.04045otherwise ​

*在写当前文档的时候,Substance Designer中 “线性到rgb”和“rgb到线性”节点由于优化的原因并不使用这个公式,这可能会在未来版本中改变。

为了简单起见,对于本指南中的所有转换,我们改用了以下简化(但近似)的转换函数:
Clin=(Csrgb)2.2C_{lin} =(C_{srgb})^{2.2} Clin​=(Csrgb​)2.2

PBR的主要特征

现在我们已经研究了PBR背后的物理理论,可以推导出PBR的一些主要特征了:

  1. 能量守恒定律。 表面反射的光线永远不会比接收的光线明亮。着色器的算法将会确保计算一定会满足这个定律。
  2. 菲涅耳效应。 BRDF也由着色器处理。 F0对于大多数常见的绝缘体而言的变化很小,在2%到5%的范围内。 而金属的F0值很高,范围在70-100%之间。
  3. 高光反射的强度通过“BRDF”、“粗糙度贴图/光泽度贴图”和F0来控制。
  4. 光照计算在线性空间中进行。 着色器通常会将所有具有伽玛编码值(例如基础颜色或漫反射)的贴图转换为线性,但是在将图像导入游戏引擎或渲染器中时,可能需要检查相应的选项,以确保正确处理了转换 。而代表“数值”的贴图(例如粗糙度,光泽度,金属和高度)应设置为“线性”。

翻译Allegorithmic的文档《THE PBR GUIDE - PART 1》相关推荐

  1. 如何翻译英文PDF?如何翻译英文word文档?

    如何翻译英文PDF?如何翻译英文word文档? 无论是写论文的学生,还是查阅需求文档的程序猿,都会接触各种英文的文档.大部分人的英语水平,在面对满是专业词汇的文献时想必都是一败涂地.现在市面上的一些翻 ...

  2. 资源:网页翻译API(文档)

    文章目录 网页翻译API汇总 VS 技术储备 一.百度翻译API(文档) 1.1. 官方文档: 二.必应翻译API(文档) 2.1. 官方文档: 2.2. 资源: 三.Google在线翻译API(文档 ...

  3. Word怎么在线翻译,Word文档在线翻译使用什么软件

    大家肯定也熟悉Word文档,在外企工作的人员也会接触到外文版的Word文档,我们不熟悉他们的文字,这个时候就要想办法将Word文档在线翻译成中文进行阅读,给大家推荐一个软件-迅捷在线翻译,下面就是小编 ...

  4. 使用DeepL 翻译后的文档不能编辑 解决办法

    使用DeepL 翻译后的文档不能编辑 解决办法 这里默认已经将整篇中文文章通过DeepL工具翻译为英文啦! 1.将翻译后的英文文件,另存为RTF格式 2.桌面新建一个文本文档,并将RTF格式的文件拉入 ...

  5. 使用 Python 翻译 CHM 帮助文档

    此方法绝对切实可行 翻译成品项目: GitHub - foyoux/InstallShield2020-Documents: InstallShield2020 中文文档 效果预览 ​ 安装 doct ...

  6. 有关计算机文献的外文和翻译,【精品文档】关于计算机专业有关的外文文献翻译成品:Spring Boot的数据访问(中英文双语对照)19.docx...

    此文档是毕业设计外文翻译成品( 含英文原文+中文翻译),无需调整复杂的格式!下载之后直接可用,方便快捷!本文价格不贵,也就几十块钱!一辈子也就一次的事! 外文标题:Data Access with S ...

  7. Java文档阅读笔记-Guide to the Hibernate EntityManager

    1. Introductino EntityManager是JPA的一个API,他实现了JPA2.0的程序接口和程序生存周期. 下面将介绍其使用方式. 2. Maven Dependencies 引入 ...

  8. 【翻译】Dagre-D3 文档整理和翻译

    地址: github Dagre-D3 目录 文章目录 dagre-d3 设计优先级 安装 npm Bower Browser Scripts 源代码构建 如何使用Darge 聚焦渲染 例子 配置布局 ...

  9. YUV视频格式详解(翻译自微软文档)

    Video Rendering with 8-Bit YUV Formats Gary Sullivan 和 Stephen Estrop 微软数字媒体部门 四月 2002年 更新于 八月 2003 ...

  10. 后端开发常用框架文档及中文翻译

    https://www.docs4dev.com 包含 Spring 系列文档(Spring, Spring Boot, Spring Cloud, Spring Security, Spring S ...

最新文章

  1. JPPhotoBrowserDemo--微信朋友圈浏览图片
  2. Failed to load module canberra-gtk-module错误的解决方案
  3. 【Boost】boost库中thread多线程详解6——线程组简单例子
  4. java gc cms_Java垃圾收集器:G1GC何时将CMS强制退出?
  5. mysql查看服务器CPU和内存_怎么查看服务器的cpu和内存的硬件信息
  6. 函数式编程语言:LISP/Scheme 小语种简介
  7. Codility:Titanium 2016 challenge:BracketsRotation
  8. 为什么我们不再购买技术类书籍
  9. HBase性能优化方法总结 (转)
  10. 威纶通触摸屏与西门子PLC200之间的无线通讯
  11. 举例说明计算机在现实应用中的作用,【举例说明多媒体技术的应用】_论多媒体技术在日常工作生活中的应用...
  12. Eplan教程——线束的使用
  13. 查找算法 binary_serach
  14. 基于can总线的A2L文件解析(2)
  15. 数据结构与算法——慕课作业——第一章 概论 + 第二章 线性表
  16. 菜鸟学习c语言之路开始
  17. Windows找不到文件‘Chrome‘。请确定文件名是否正确后,再试一次
  18. p30升级鸿蒙能支持5G网络吗,华为p30支持5g吗
  19. iOS ijkplayer 音视频同步
  20. 滑动门套滑动门css,JS+CSS实现带小三角指引的滑动门效果

热门文章

  1. 人工智能驱动的智能制造(人工智能系列)
  2. 面试题:PCB包括哪些内容
  3. echarts实现左右滑动
  4. Unity3D Dither 抖动Shader实现
  5. VS Code 中解决 C++ 代码编写时的爆红
  6. 算法竞赛宝典 递归算法 地盘划分
  7. 抽奖活动前端源码-可录入抽奖人名单
  8. 常见的影视cms及安装环境说明
  9. ios-音乐播放器的简单实现
  10. 关于Mybatis的深入学习(4)之动态SQL二十四道练习