沐鸣咨询58255957_硬核干货!各路专家编制+腾讯翻译的《PBR指引手册》(二)
万物皆可 PBR, 本手册带你知其然也知其所以然。
近日在研究 3D-TO-H5 工作流及学习 PBR 的过程中,发现 Substance 官方新版的《The PBR Guide》尚未有完整的中文翻译,所以把心一横,斗胆翻译了一波,希望能抛砖引玉,让大家更深入浅出地了解 3D 材质贴图及 PBR 技术。
上期回顾:
3D 贴图硬核干货!各路专家编制+腾讯翻译的《PBR指引手册》(一)
万物皆可PBR, 本手册带你知其然也知其所以然。
阅读文章 >>
PBR,Physically-Based Rendering,意为基于物理的渲染,是一种能对光在物体表面的真实物理反应提供精确渲染的方法,也是近年来极其生猛的 3D 工业趋势。
《The PBR Guide》是由 Substance by Adobe,Demo Artist Team 负责人 Wes McDermott 主笔,并由 3D 领域各路专家共同编制的 PBR 指引手册。本书分为《Part1:物理现象浅析》及《Part2:材质制作指南》两大部分,从理论到实践,深度解析 PBR 工作流。
文章内容硬核中又略带苦涩,建议看官们分次服用。
The PBR Guide Part2 原文地址:
https://academy.substance3d.com/courses/the-pbr-guide-part-2
上一章从理论的角度讲述了 PBR 的原理,接下来将会从实操的层面来介绍如何制作 PBR 材质。
首先本章节会从艺术工作者的角度重新定义 PBR,讲述 Metal/Roughness 工作流、Specular/Glossiness 工作流以及其中的差异。建议读者们可以先通读两个工作流的原则来了解贴图制作的全貌。
在这个指南中,我们会使用 Substance 的软件系列来演示整套工作流,但是 PBR 贴图和材质制作的原理其实在不同软件中都是通用的。
PBR 渲染是一个方法而非一个硬性的规则,虽然其中有很多特定的物理原则和规范,但是操作中并没有唯一的真理,渲染效果可以由不同的手段来实现,贴图的种类和工作流的使用方式也可以五花八门。GGX 的 BRDF 是最常用的物理算法,但实际上基于不同渲染器及工作流,算法也会应而有异。另外,在不同的实现方式中,贴图的名字可能也会有所不同,尽管它们对应的用法可能实际上是一样的。
在这个部分,我们会讨论两个最常用的工作流:金属/粗糙度工作流(Metal/Roughness)和镜面反射/光泽度工作流(Specular/Glossiness),并使用 Substance 系列工具制作贴图(能同时支持两种工作流),其中包括了 Substance Designer,Substance Painter 和 Substance B2M。对于两种工作流来说,Substance PBR 默认着色器使用了 GGX BRDF,没有对粗糙度/光泽度进行重新映射。然而,如果你想定制自己的映射(Remapping),也可以在 Substance 系列软件里轻松完成。
另外,Substance 系列软件支持对着色器进行定制,也就是说你可以调整 Substance 的设置来适应定制化过的渲染管道(Customized Pipeline)。
两种工作流都有它们自己的优缺点,没有哪个更优更劣,只有选择最适合你贴图表现的工具流才是正道。毕竟是内在的概念和原理使得贴图表现更为精确,而非工作流本身。即使它们两者最终可能都表现出了一样的性状,但内核却有着不同的实现方式。
1. 什么是PBR?
PBR(Physically Based Rendering)基于物理的渲染,是一种能对光在物体表面的真实物理反应提供更精确着色与渲染方法。在渲染管道中的不同环节,它也会被称为物理着色(Physically Based Shading,PBS),PBS 通常是指着色,而 PBR 通常是指渲染和光照。不过,两个名词其实都是指基于真实物理下精确渲染场景的过程。
2. PBR的优势?
作为设计师,我们可以从艺术角度和制作效率两个维度去看待 PBR 的优势:
- PBR 的方法论和算法都是基于物理精确的公式实现的,这让我们在制作过程中无需反复猜度和测试很多材质的属性,也让我们更容易去制作一个更真实的场景。
- 场景和模型在所有光线条件下都会表现得非常精确。
- PBR 提供了一个稳定的工作流,让不同的艺术家在不同的项目之间都保持相对恒定的输出模式。
3. PBR对艺术工作者的意义是什么?
随着硬件及其渲染能力的提升,我们能越来越精确地模拟光的真实物理性质。作为艺术工作者此时就需要去理解每一个贴图它描述和代表的是哪些属性,会对模型造成哪些影响。
我们需要扔掉过往对漫反射贴图(Diffuse)和镜面反射贴图(Specular)的认知,因为在传统渲染工作流中,这两个贴图只是一个对光与材质比较粗糙的估算方法。
在 PBR 中,着色器负责执行符合能量守恒和 BRDF 物理定律的渲染工作,而艺术工作者则需要根据物理定律来创造贴图。PBR 很科学的一点就在于,它已经把很多材质的性质用物理的真实条件定义下来,设计师不需要再盲猜盲试它们的实现效果,从而可以将更多的时间投放在贴图的创意和设计上。
虽然符合规范和制作正确的贴图是很重要的事情,但是也并不意味着我们要放弃艺术性的直觉。3D设计师要时刻记住,是艺术的理解和角度真正赋予了材质生命,并在精雕细琢的细节和表达方式中体现了材质的故事。物理现象从来不是艺术家真正需要思考的核心,在物理的环境下工作并不意味着我们就不能创造出有风格的作品。
举个例子,迪士尼的物理折射模型(Physically-based Reflectance Model)虽然是一个可被当做规范的方法,但我们更应该把它当做一个艺术指导,而非一个严格的物理模型。设计师应该学会如何应用这些规范和原则而不是被他们所限制。
金属/粗糙度工作流(Metal/Roughness Workflow,下文简称M/R工作流)是由一系列的贴图通道所定义的工作流,这些通道会被作为贴图传输到 PBR 的着色采样器中。这个工作流对应的贴图包括 Base Color(基础色贴图)、 Metallic(金属贴图)、 Roughness(粗糙度贴图)(图 17)。
在 M/R 工作流中,PBR 着色器也同时使用 Ambient Occlusion(环境光遮蔽/环境吸收/AO贴图,下文统称环境光遮蔽贴图)、 Normal(法线贴图)、Height(高度贴图)来表现光影视差与置换位移的映射效果(图 18)。
在此工作流中,金属的反射值和非导体(电介质)的 F0 值都被记录在 Base Color 贴图中,在掠射角的反射效果(菲涅尔效应)则交由 BRDF 来处理。金属贴图在此工作流中就像 Photoshop 里的遮罩一样,用于区分 Base Color 贴图中金属与非导体材质的区域。非导体的 F0 值并非人工制定,而是由着色器来处理。当着色器监测到金属贴图中的黑色区域时,它会认为这片区域在 Base Color 中的表现是非导体(电介质)材质,从而统一使用 4%(0.04)的反射值。
在第一章中,我们也有提到过,4% 这个值基本上可以涵盖常见的非导体材质。需要注意的是所有的数值,包括非导体的 F0、金属的反射值、反照率颜色的亮度范围都是从实际测量的数值中得来的。当本文谈到单个贴图时,也会探讨哪些是基于测量数据制作的。
在能量守恒定律中也提到过,光从一个表面反射出去的量不会多于它入射在表面上的量。在渲染的实现层面,这个定律一般都由着色器强制执行。在 Substance 和 M/R 工作流也一样,我们是不可能打破能量守恒定律的。由于漫反射色(Diffuse/Reflected Color)和镜面反射(Specular)的平衡关系由金属遮罩(Metallic Mask)来控制,所以渲染计算时不会出现反射色和镜面反射加起来比入射光还多的情况(因为当极限情况下,金属遮罩全白时,材质表现为全反射,此时反射光最多等于入射光)。
1. 非导体(电介质)的F0
对于大多数普通的非导体(电介质)材质来说,反射值都被设为 0.04(线性空间),即 4% 的反射率。在 M/R 工作流中,这个值一般是着色器不可变更的。
不过在另一些 M/R 实现流程中,例如 Substance 系列软件、Unreal Engine4 就会有提供一些控件让艺术家可以修改非导体(电介质)的 F0 值。在 Substance 中,这个输出区间被标签为「Specular Level」,由 Metal/Roughness PBR 着色器的材质采样器提供。它代表了 0.0-0.08 这个区间在着色器中会被重新映射为 0.0-1.0,而 0.5 就代表着 4% 的反射率(如图 20)。
如果你需要手动设置非导体的 F0 值,也可以使用 Substance Designer 里的 Substance Graph/Specular Level Output 来设定,又或者是 Substance Painter 里的 Specular Level Channel 来调整(图21)。本文会在 Specular/Glossiness 工作流中继续深入讨论非导体(电介质)F0 的属性,因为在 S/G 工作流中,设计师可以对 F0 进行全面的控制。
2. 基础色贴图 Base Color
RGB贴图-sRGB
Base Color 贴图是一个 RGB 贴图,它能包含两种类型的数据:非导体(电介质)的漫反射色/反照率颜色(Diffuse Reflected Color/Albedo)和金属的反射值(如图 22)。导体的颜色代表着它本身反射的光的波长,这个原理我们在第一章有提到(不同的金属反射不同的色光)。如果这个区域在金属贴图中被指示为金属(金属贴图中为白色),那么这个反射值就会被显示出来。
制图指引
Base Color 贴图的色调一般看起来会比较平,它的对比度会低于传统的 Diffuse 贴图(传统的 Diffuse 贴图带有光影信息),因为在贴图中,如果数值太亮或太暗可能都会影响后续的光影渲染效果。物体在光影色调中的实际效果通常比我们印象中存在的样子亮很多。可以试想一下,以碳作为最黑的物质,而雪作为最亮的物质。虽然碳的固有色看上去是黑的,但是它不是 0.0 的黑,同样雪也不是 1.0 白。所以我们对于基础色的选择需要在一定的亮度范围内,这样物体在渲染环境中才能表现出更明亮的高光和更深邃的阴影。
说到亮度范围,这里通常是指非导体(电介质)材质反射的颜色。在图 23 中,你可以看到污垢的色值超出正确亮度范围的效果(红色区域)。对于暗色值,尽量不要低于 30-50 sRGB,严格控制下应该不低于 50 sRGB。对于亮色值,贴图中也不应该有色值高于 240 sRGB。
Base Color 贴图中包含着非导体(电介质)材质的反射光信息,所以里面应该避免含有类似 AO 这种光照信息。但是有一种情况可以除外,当着色器不能只用 AO 通道来表现出我们预期的细节时,我们可以在 Base Color 中增加微观遮蔽(Micro-occlusion)效果。然而,当 Micro-occlusion 被加到贴图时,它仍然需要被亮度范围所限制。
当 Base Color 贴图中的值是指金属的反射值时,这些值应当采用真实世界中的测量值。这些值大概会有 70-100% 的镜面反射,映射到 sRGB 大概为 180-255。
在 Substance PBR 应用的部分,我们会再讨论能预设 F0 值的工具。而由 Sebastien Lagarde 制作的 Metal/Roughness 对照表同样是一个很好的参考依据。
再回顾一下Base Color的几个重点特性:
- 贴图中的颜色对于非金属材质来说是它的反照率颜色(Albedo),对于金属材质来说则是它的反射值(Reflectance value,所带色相与其反射的波长有关)。
- Base Color 除了微观遮蔽信息(Micro-occlusion)以外,不应该含有任何光照信息。
- 暗色值在宽松条件下不应该低于 30 sRGB,严格来说不应该低于 50 sRGB。
- 亮色值不应该高于 240 sRGB。
- 原始金属的反射值一般都非常高,大概能达到 70-100% 的镜面反射,映射到 sRGB 范围大概是 180-255。
本文稍后会介绍金属的部分,由于 Base Color 中也包含了金属的反射值,如果金属的 Base Color 贴图加入了污垢或者氧化的颜色,那么它们就会使得原来表示金属反射值的数据低于原始金属应有的范围,此时这块区域也不应再被认为是原始金属。
所以金属贴图也务必包含污垢和氧化区域的信息,而且它们的数据必须更低(白色为原始金属,所以非金属应为灰阶)来表示这块区域不再是原始金属。在图 25 中,你可以看到,这块生锈的金属中非金属(锈迹)的部分被设置为黑色。同样,金属贴图并不是非黑(0.0)即白(1.0)的蒙层,污垢在金属贴图中表现为过渡的灰阶,表示着其为程度不一的非导体(电介质)材质。
金属贴图的功能可以理解为一个遮罩,它告诉着色器应该如何去解读 Base Color 贴图中的 RGB 数据。
3. 金属贴图 Metallic
灰度贴图-Linear
金属贴图是用于定义物体中哪个区域是原始金属的贴图。作为一个灰度贴图,他的作用就类似于一个图层遮罩,告诉着色器应该如何去解读 Base Color 贴图中的 RGB 数据。
金属贴图中并没有包含直接被材质引用的真实世界的数据(如反照率颜色、反射值等),它只是比较简单地对着色器描述 Base Color 中的哪个区域应该被解析成反照率颜色(非导体),哪个区域应该被描述成金属的反射值。
在金属贴图中,0.0(纯黑-0sRGB)代表了非金属,而 1.0(纯白-255sRGB)代表了原始金属。当金属贴图被用于定义原始金属与非金属时,一般都是二态的:纯黑或纯白,意味着材质除了原始金属就是非金属。在实现过程中,当着色器监测到金属贴图中的白色区域时,它会检查 Base Color 贴图中相应的位置来获取金属的反射值并进行渲染(如图26)。
制图指引
金属表面有两个和材质相关的重要属性:第一,它们的反射值一般很高,会造成 70-100% 的镜面反射。第二,有些金属会被腐蚀。我们接下来会在制图指引中单独讨论这两个属性。
原始金属Raw Metal
当金属贴图被赋值为 0 或 1 时,这就意味着这片区域是或不是原始金属,而原始金属就是指未被腐蚀、完美抛光的金属状态。作为一个通用的准则,原始金属在金属贴图中的灰阶范围大概是 235-255 sRGB 之间。在这个区间里的金属会在 Base Color 贴图中会透传为 70-100% 的反射值,而对应 sRGB 范围 180-255 sRGB(如图 27)。再次强调一下,Base Color 中这些数值都是基于真实世界测量的数据。
腐蚀的或非导体(电介质)图层 Corroded or Dielectric Layer
当设计师在做旧一个金属材质时,需要考虑这个金属材质是否被腐蚀,并考虑环境中诸如污垢和尘埃等因素。在这些情况下,金属材质的局部就需要被当做是非导体(电介质)材质来看待。对于上漆的金属也是一样,如图 28 所示,当漆层被划开或撬掉时,会露出底部的原始金属(金属贴图中显示为白色),而有漆的部分仍旧是一个非导体图层(金属贴图中显示为黑色)。
金属贴图也可以用过渡的灰阶来表示金属与非金属在贴图中的混合状态。如果在金属贴图中有灰色色值低于235 sRGB 时,你需要手动降低 Base Color 中原始金属的反射值。在图 29 中我们可以看到,污垢层遮掩了一部分的金属,而污垢实际上是非导体(电介质),如果金属贴图中,对应污垢的地方仍是白色,那么渲染时,着色器就会认为这个区域的 Base Color 是金属的反射值。但是我们也知道,污垢的色彩值是远远低于抛光金属 70-100% 的反射值的。此时,只有降低金属贴图中代表污垢的值,才能精确实现这种介乎于非导体与高反射金属之间的混合材质。
污垢层的透明度决定了 Base Color 中的反射值能被降低多少。这里其实没有硬性的规定。本质上你只是将一个高反射表面(导电材质)转换成低反射表面(非导体材质),然而这中间的过渡情况是应情况而异的。
使用 Substance 工具能够很好地展示磨损效果,而且这些效果不仅影响单个通道的贴图,也会延伸到其他通道上。在 Substance Designer 和 Substance Painter 中,你可以通过 Substance 效果生成器来调整参数,它会自动地对效果进行跨通道的调整。
举个例子,在 Substance Designer 中可以使用 Material Color Blend 节点对效果进行跨通道的应用(例如污垢效果)。在 Material Color Blend 中,也可以透过调整金属值(Metallic Value)来控制污垢在金属上的效果(图 30)。
我们再来回顾一下金属贴图的几个要点:
- 金属被氧化、腐蚀、上漆、覆尘后,这些区域需要被当做非导体(电介质)材质来看待。
- 在金属贴图中,纯黑(0.0)代表了非金属,纯白(1.0)代表了金属,我们可以用过渡的灰阶来表示不同程度氧化和污垢。
- 如果金属贴图中有值低于 235 sRGB,那么在 Base Color 中对应区域的反射值也应该降低。
4. 粗糙度贴图 Roughness
灰度贴图-Linear
粗糙度贴图用于描述造成一个表面的不规则度,这种不规则度会造成光的漫射(如图 31)。正如我们在第一章中所说,光会基于表面的粗糙度进行方向随机的反射。虽然这个现象中光的方向被改变,但是光的强度是恒定的。越粗糙的表面会拥有越大越暗的高光,而越光滑的表现就越能将镜面反射聚拢,让高光看上去更亮更强。尽管这两者实际上都是反射了强度一样的光。
在粗糙度贴图中,纯黑(0.0)代表了平滑表面,而纯白(1.0)代表了粗糙表面。粗糙度贴图可以说是最有创造力的贴图,因为它允许艺术工作者从视觉上定义这个表面的特性,你可以从一个表面的材质成色和状态来讲述它的故事。它正处在什么环境中?它是被呵护的还会被糟蹋的材质?它有没有被暴露在自然环境之中?一个表面的状态可以透露出它所在的环境、场景以及你希望创造的世界观。
粗糙度是一个非常主观的领域。作为一个艺术设计者应该放开手去尝试。而法线贴图往往也是粗糙度的一个很好的切入点,因为法线贴图往往也包含着很多关键的表面细节,而这些细节也常常在粗糙度贴图中复现。
制图指引
发挥你的创意,说出贴图的视觉故事。
5. 分辨率与纹素密度 Resolution and Texel Density
M/R 工作流的其中一个副作用就在于会产生白边效应(如图 32)。这个情况在 Specular/Glossiness 工作流中也会发生。然而在 S/G 工作流中,效果不会那么明显,因为白边会变为黑边。(如图 33)
这样的边缘效应是由于材质的插值造成的,在非导体(电介质)材料与明亮金属这种强对比的过渡边界处尤为明显(如图 34)。在 M/R 工作流中,Base Color 里包含了非常亮的金属反射值,其中又插入了非金属漫反射色的数值,所以产生了白边。在 S/G 工作流中,Diffuse 贴图中因为原始金属并没有漫射色,所以呈现为黑色。而这些代表金属的黑色值又在材质交界处被插入了非金属的漫射色,所以边缘也呈现出黑色。
贴图文档的分辨率与纹素密度对边缘效应也有着直接的影响。举个例子,如果你用硬笔刷来绘制金属与非金属的交界,在低像素的文档中,这个交界的像素依然会被软化,从而加剧这个边缘效应。而低分辨率的问题也有可能是由 UV 的比例造成的,如果模型的 UV 在导入前没有被等比放大到一定程度(局部 UV 的面积太小,即使它在高清纹理中,它的纹素密度未必会足够高),它就无法提供足够的纹素密度来满足这个贴图的分辨率,边缘效应也会比较明显。所以最好的减轻边缘效应的方法,还是需要前期就给 UV 提供足够的纹素密度(如图 35)。
在图 35 中,两组纹理都是用了 2K 分辨率,但是右边的 UV 比例由于布局时就偏小,所以它的纹素密度也非常低。
制图指引
纹素密度与分辨率直接影响了 M/R 工作流中的白边效应。如果希望减轻这个现象,就需要在前期保证 UV 展开时的布局和面积,保证它能提供足够的纹素密度,来对应材质制作文档的分辨率。
6. 金属/粗糙度工作流的优劣势
优势
- 在 M/R 工作流中,由于非导体(电介质)的 F0 都是规定好的,所以设计师在对非导体 F0 赋值时不易出错。
- 纹理的缓存压力更小,因为金属贴图和粗糙度贴图都是灰度贴图。
- 目前来说是兼容性最广的工作流。
劣势
- 非导体(电介质)F0 的值固定为 4%,无法调整。然而,在大多是实现流程中都有控制器可以直接复写这个值,所以也不能算硬伤。
- 白色边缘问题较明显,尤其在低分辨率的情况下问题突出。
和 M/R 工作流一样,镜面反射/光泽度工作流(Specular/Glossiness Workflow, 下文简称 S/G Workflow)也是透过一系列通道贴图来进行定义的。这些 S/G 工作流独有的贴图分别是 Diffuse(漫反射贴图)、Specular(镜面反射贴图)、Glossiness(光泽度贴图)。
虽然 S/G 工作流使用了我们比较熟悉的名词,如 Diffuse 和 Specular,但是需要注意区分的是,这些贴图对应的真实属性和他们的传统含义并不完全一致。Substance 里用的叫法是 Diffuse(漫反射),但是在某些实现流程中也被叫做 Albedo(反照率颜色)。
除此之外,之前也提到过在两套工作流里,PBR 着色器都可以用到 AO 贴图、法线贴图和高度贴图来表现光影视差与置换位移的映射效果。
在这个工作流里,金属的反射值和非金属的 F0 值被放置在镜面反射贴图(Specular)中,而且将有两张 RGB 通道的贴图:Diffuse Color(Albedo)和镜面反射贴图(Specular)。在镜面反射贴图中,你可以对非导体材质的 F0 值进行控制。
正如我们在 M/R 工作流中提到过的一样,PBR 着色器自动遵循能量守恒定律。而在 S/G 工作流里这显得更为重要,因为在镜面反射贴图中,设计师可以对非导体(电介质)的 F0 值进行控制。这就意味着,那张贴图很可能被人为赋予错误的值。举个例子,一个纯白的漫反射(1.0)和一个纯白(1.0)的镜面反射值加起来表示的反射光线就多于它原来接受的光线,而这就打破了能量守恒定律。结果就是,当我们这么制作材质时,材质数据就无法产生真正合理的效果。
如你所见,贴图中呈现的数据和 M/R 工作流是一样的,只是数据被放在了不同的贴图,所以仍会遵循一样的制图规范,差异就在于我们应该如何制作这些 S/G 工作流的贴图。
之前也提到过,非导体(电介质)的 F0 值、金属的反射值、反照率颜色的亮度范围,这些都是真实测量的数据。接下来当讲到每个贴图种类时,会更具体地讲述基于测量数据的贴图该如何制图。但和 M/R 工作流重复的内容则不再赘述,本段会更集中地比对两套工作流的差异。
1. 漫反射贴图 Diffuse
RGB贴图-sRGB
正如 M/R 工作流中的 Base Color 贴图,漫反射贴图包含了反照率颜色。然而它却不包含任何反射值。
制图指引
由于漫反射贴图中只包含反照率颜色(Albedo),所以那些指示原始金属的区域会被标记为黑色(0.0),因为金属不会有任何漫反射色彩(如图 37)。如果金属受到了氧化或腐蚀,则该区域会带有一定的颜色,而且也不会被判定为原始金属。除此之外,污垢、上漆等在原始金属上增加了一层非导体(电介质)材质图层,在漫反射贴图中都是一样的处理。
所以 Diffuse 在色调上的制图指引和 M/R 工作流中的 Base Color 几乎是一样的,区别就在于如果贴图需要展示原始金属,那么该区域就是为零的值(显示为纯黑,0.0),而且不会受到暗度范围的约束。
- 漫反射贴图中的颜色表示的是非金属的反照率颜色,而纯黑(0.0)代表的是原始金属。
- Base Color 除了微观遮蔽(Micro-occlusion)外不应该带有其他光照信息。
- 除了表示金属的纯黑(0.0)外,暗色值最多不应该低于 30 sRGB,严格上说,不应该低于 50 sRGB。
- 亮色值不应该亮过 240 sRGB。
2. 镜面反射贴图 Specular
RGB贴图-sRGB
镜面反射贴图是用于定义金属反射值和非导体(电介质)F0 值的贴图(如图 38)。由于镜面反射贴图是 RGB 贴图,所以非导体材质可以赋予不同的 F0 值。而在 M/R 工作流中,非导体(电介质)的 F0 值是被写死的 4%,而且也只能透过软件中的「Specular Level」通道来调整。正如我们在 M/R 工作流中提到的一样,F0 值需要从真实世界的测量中获得,而这个 F0 值一般来说都会是比较暗的值。对于金属而言,由于不同的金属会吸收不同光的波长,所以他会反射出不同的颜色。在镜面反射贴图中,金属和非导体的 F0 值都被写在了 RGB 通道当中。
制图指引
由于镜面反射贴图包含了金属和非金属的 F0 值,所以我们也会分别描述他们的制图规则。
原始金属
原始金属的 F0 值应该是基于真实世界测量的数据来设定。如果金属产生了氧化或者有些覆盖层被定义为非金属时,这个金属区域的反射值就要降低。而在 S/G 工作流中,污垢和氧化层在漫反射贴图中的色值会变亮,而在镜面反射贴图中的色值会变低(如图 39)。图 39 中展示了原始金属上存在污垢层,而这片污垢在镜面反射贴图中就使用了正确的非导体(电介质)F0 值(在这个案例中使用了 4%)。
非导体(电介质)
非金属的 F0 值同样也被记录在镜面反射贴图中。在这里,虽然你可以自由地调整非导体(电介质)的 F0 值,但是务必要使用正确的值。正如我们在第一章提到的,非金属(绝缘体/非导体/电介质)是较差的电导体。由于光被折射或被吸收(或者穿透表面再次发射),所以这些材料会比金属反射的光少得多。基于折射率(IOR)的运算,大部分非导体的 F0 值会在 2-5% 左右,而宝石是一个特例。在线性空间中的换算,大部分非导体的 F0 值大概是 0.02-0.05 左右。
在 sRGB 中,我们会使用 40-75 sRGB 的范围,对应线性空间中 0.02-0.05(2-5%)的区间。
如果你无法知道某个材质的折射率,可以假设它的 F0 为 4%(0.04是塑料的反射值),而宝石的反射值较高,在线性空间中大概是 0.05-0.17(如图40所示)。在金属的工作流中,当你使用 Specular Level 调整时,着色器会被映射到 0.0-0.08(线性空间),此时 0 就代表空气的反射率。
来回顾一下镜面反射贴图的重点特性:
- 镜面反射贴图包含了非导体(电介质)的 F0 值和原始金属的反射值。
- 非导体(电介质)反射的光比金属少。普遍非导体的反射值为 2-5%,在 sRGB 中,这个值大概在 40-75 之间,这个区间和 0.02-0.0 5的线性空间范围是重叠的。
- 普通宝石的反射值范围在 0.05-0.17(线性空间)。
- 普通液体的反射值范围在 0.02-0.04(线性空间)。
- 而原始金属的反射值则可以高达 70-100% 的镜面反射,映射到 sRGB 约为 180-255 sRGB。
- 如果你无法找到某个材质的折射率(IOR),那么你可以先假设它的 F0 为 4%(0.04 为塑料反射值)。
3. 光泽度贴图 Glossiness
灰度贴图-Linear
光泽度贴图适用于描述表面不平整度的贴图,表面不平整会造成光的散射(如图 41)。在这个贴图中,纯黑(0.0)代表的是粗糙表面,而纯白(1.0)代表了平滑表面。这和 M/R 工作流里的粗糙度贴图是完全相反的,但是在设计侧却有着类似的制图原则。
制图指引
尽可能地表现你的创造力,来显示这个表面的故事。
4. 分辨率与纹素密度 Resolution and Texel Density
之前我们也有提到过两个工作流中会出现的边缘效应,在 M/R 工作流中,由于边缘显色为白色(金属的高反射值)所以会更加明显。在 S/G 工作流中,漫反射贴图的中的原始金属并没有漫反射色,所以显示黑色,而这些黑色值的边缘会插入非金属的漫反射色,所以就形成了如图 42 所示的黑边。
再次强调,文件本身的分辨率和贴图的纹素密度对边缘效应有着直接的影响。而表面所对应的 UV 本身的布局和大小也会对纹素密度造成影响,原理和之前在 M/R 工作流中提到的是一样的,就不再赘述。
制图指引
纹素密度与分辨率直接影响了 S/G 工作流中的黑边效应。如果希望减轻这个现象,就需要在前期保证 UV 展开时的布局和面积,让它能提供足够的纹素密度,来对应材质制作文档的分辨率。
5. 镜面反射/光泽度工作流的优劣势
优势
- 边缘效应不会那么明显。
- 可以在镜面反射贴图中对非导体(电介质)材质的 F0 值自由调整。
劣势
- 由于在 S/G 工作流的镜面反射贴图中,非导体(电介质)材质的 F0 值是可以自由调整的,所以也会导致设计师容易输入错误的值。而这些错误的值被着色器误读后可能会打破能量守恒定律,从而造成不正确的渲染效果。
- 由于新增了一张 RGB 通道的镜面反射贴图,所以对性能消耗会更大。
- S/G 工作流有些名词和传统的工作流太相似,但是实质所对应的数据可能是不一样的,因此会导致设计师容易误解或误操作。这种情况下就要求设计师有更好的 PBR 理论知识,例如了解非导体(电介质)的正确 F0 值,金属在漫反射色下表现为纯黑,以及在着色器没有自动校正情况下,能量守恒相关的基础知识。
1. 环境光遮蔽/环境光吸收贴图 Ambient Occlusion
AO 贴图用于定义一个表面上的每个点在环境光下的暴露程度,它通常被用在后制效果中(加重夹角、交界面的阴影细节等)。AO 贴图只会影响漫反射而不会遮蔽镜面反射的表现。在某些引擎(如Unreal Engine4)中会拥有一些选项,让屏幕空间的反射(Screen Space Reflection)去模拟本地反射(Local Reflections)。而最好的反射处理就是使用 AO 贴图与屏幕空间的反射进行混合。
在 Substance PBR 着色器中,环境光(由环境贴图生成)会和 AO 贴图进行叠加。AO 贴图由 PBR 着色器中的材质采样器提供,而且并不是一个必要的贴图通道(图 44)。AO 贴图不应该被烘焙在材质贴图中,因为它在着色器中只会在自己独有的通道里作用。
制图指引
在 SP 或 SD 里,AO 贴图既可以从一个模型里烘焙出来,也可以利用内置的烘焙工具制作,或从法线贴图里进行转换。而且在 SP 和 SD 里,你都可以利用 HBAO 节点或者滤镜,并通过高度的输入值来生成基于水平视角的 AO 贴图,它的效果和光线跟踪烘焙出来的效果是非常相似的(如图 45)。
2. 高度贴图 Height
高度贴图通常被用作渲染置换(Displacement)效果,它可以用作视差映射,来给纹理增加更明显的深度,而且比起法线和凹凸贴图更加真实。Substance 中用的是均匀视差映射算法(Relief Mapping Parallex Algorithm)。高度同样不是一个必要的贴图通道,而且它也是由 PBR 着色器里的纹理采样器提供的。在 SD 中,你可以使用视差遮蔽(Parallax Occulusion)或者细分镶嵌式着色器(Tessellation Shader)。在 SP 中,则可使用置换通道(Displacement Channel)来执行视差遮蔽。
制图指引
和 AO 贴图一样,高度贴图在 SP 和 SD 中既可以从一个模型里烘焙出来,也可以利用内置的烘焙工具从法线贴图里进行转换。在 SD 中可以使用节点从法线贴图里转换出高度贴图(图 47)。而在 SP 中,你可以直接绘制高度的细节(图 48)。
为了节省性能,在实时渲染器中使用高度贴图时,我们应该减少贴图中的高频细节。高度贴图设计时更倾向于呈现置换体(用于置换几何体面形态的形状)的整体轮廓。一个比较推荐的实操方式是,用模糊/精度较低的高度贴图来塑造置换体的外形,并且减低它的高频细节。然后,再用法线贴图来提供高频细节,而高度贴图只置换了整体轮廓。如果你在光线跟踪渲染器(Raytrace Renderer)里使用高度贴图实现置换效果时,高频细节就不可缺失了。
3. 法线贴图 Normal
法线贴图可用于模拟表面的细节。贴图中的 RGB 通道分别对应的是表面上不同部位法线的 X、Y、Z 坐标。它可以用作保存高模的细节,并且映射到低模中去。在 Substance 工具系列中,你可以烘焙法线贴图也可以从高度贴图里转换法线贴图。
制图指引
在 SP 或 SD 中,可以利用内置的烘焙工具从模型中烘焙法线贴图。在 SD 中,你可以利用法线点将高度转换成法线贴图(如图 50)。而在 SP 中,你也可以直接在 3D 视图中直接绘制法线数据(如图 51)。
在这个章节里,我们将介绍几个可以制作 PBR 贴图的工具,以及如何设置正确的反射值。这些工具都是对应这本指南中提到的概念和原则进行设计的。
1. Substance Designer
PBR 基础材质 (PBR Base Material)
SD 中有一个支持创建 PBR 完整基础材质的节点,可以在 Material Filter/PBR Utilities 里找到(图 52)。它同时支持 M/R 工作流与 S/G 工作流,并且为原始金属材质提供了通用的预设。如果你需要创建非金属材质,SD 也允许用户对反照率颜色(Albedo)进行设置。对于不同的工作流,Roughness 和 Glossiness 两个通道的控制器可能有所不同,并且伴随着一系列对应的可控制项。你可以在对应通道里使用贴图并查看其效果,如 Base Color、法线或者高度贴图。
非导体(电介质)F0值
这个节点可以用作输出常见非导体材质的 F0 通用值(图 53),它位于 Material Filters/PBR Utilities 中。你可以在预设中选择,也可以手动输入。这个节点有一个折射率(IOR)的输入框可供设定,它会根据这个折射率来计算 F0 的数值。它是专门为非导体材质所设的,并且可以在 S/G 工作流中使用。
金属反射值
金属节点可以用作输出常见原始金属的反射值,它位于 SD Library 的 Material Filters/PBR Utilities 中。同样的,你可以从预设里面选择合适的金属反射。
PBR 金属/粗糙度 校验
在 M/R 工作流中,这个节点用于检查 Base Color 和 Metal Maps 里的错误数值。它位于 Material Filters/PBR Utilities。这个节点会输出一个从红>黄>绿的热力图,红色区域显示的就是错误的数值区,而黄色和绿色区域则是正确的。金属情况下,它会检查被金属贴图中示意为金属的区域,在 Base Color 中对应的 F0 值是否正确(大于235 sRGB),热力图会显示哪些地方的 F0 范围过低。对于 Albedo 贴图来说,它则会验证非导体的亮度范围是否正确。
PBR 安全色 / PBR Safe Color
这个节点会修正 Base Color 和 Diffuse 贴图中的值(如图 56 所示),它会保证电介质的亮度值落在正确的范围内。这个节点位于 Material Filters/PBR Utilities。
贴图转换 Conversion
这个节点可以将 M/R 工作流中的贴图转换到适应不同渲染器的贴图,同样可以在 Material Filters/PBR Utilities 中找到。目前可支持以下渲染器:
Vray(GGX), Corona, Corona 1.6, Redshift 1.x°, Arnold 4(aiSurface)°, Arnold 4(aiStandard)°, Renderman(pxrSurface)
值得注意的是,Arnold 5 和 Redshift 2.x 目前可支持 Base Color/Metallic/Roughness 工作流直出的贴图。
2. Substance Painter
PBR 金属/粗糙度校验(滤镜) PBR Metal/Roughness Validate(filter)
在 M/R 工作流中,这个滤镜用于检查 Base Color 和 Metal Maps 里的错误数值(如图 57)。它是一个免费的滤镜,你可以在 Substance Share 中下载。
这个滤镜也会输出一个从红>黄>绿的热力图,红色区域显示的就是错误的数值区,而黄色和绿色区域则是正确的。对于金属材质来说,它会检查被金属贴图示意为金属的区域,在 Base Color 中对应的 F0 值是否正确(大于235 sRGB),热力图会显示哪些地方的 F0 范围过低。对于 Albedo 贴图来说,它则会验证非导体的亮度范围是否正确。
在 SP 中使用时,可以将滤镜导入到你的项目中,或者将这个滤镜直接拷贝到滤镜文件夹中常备。
3. Substance 输出与渲染
从 Substance Source 中获取的 Substance 材质都可以支持 M/R 工作流和 S/G 工作流。他们的输出内容都可以用在 PBR 实时着色器中,例如 Unreal Engine 4 或者 Unity。而 Base Color/Metallic/Roughness 相关输出也可以被应用在可以支持金属工作流的光线追踪渲染器中(Raytraced Renders),如 Arnold。而 S/G 相关的贴图只能用于实时着色器。对于不同的渲染器,你可能可以直接使用 BaseColor/Metallic/Roughness 贴图,又或者需要对它们进行转换。
然而对于某些渲染器来说,从 Substance Source 中下载的定制化或自由创作的材质或资源可能并不具备符合 PBR 的标准输出,因为他们可能只包含了 Base Color/Metallic/Roughness 的贴图。所以在应用材质前,我们需要充分理解当前导入材质所携带的贴图类型及输入数据,以及当前使用的渲染器能接受哪种贴图类型或输入数据,这样才能对输入源进行对应的转换,并且最终正确应用和输出 Substance 材质。
举个例子,在 Arnold 5 中,你可以直接使用 M/R 工作流的输出贴图。然而在 Vray 材质中,你需要对 M/R 的输出贴图进行转换,使其生成反射贴图和 1/IOR 贴图。Substance Painter 支持若干第三方渲染器配置(如图 58),可根据后续对应的渲染器进行输出。
Substance 协作插件可以将 Substance 材质的输出物直接转换到特定渲染器可使用的格式。举个例子,3ds Max 的 Substance 协作插件有各类预设,可以与 Arnold、Vray、Corona 打通。使用这些预设会自动将 Substance 输出贴图进行转换,并可直接应用在这些渲染器中。
想了解更多关于 Substance Painter 和 Substance Designer 的操作,可以参考 Substance Integrations 的官网渲染文档。
在创建材质的初期,当我们需要对材质进行判别时,将表面材质拆分为金属与非金属两个类目来理解会更加直观有效。从下面两个表格中,我们可以快速查阅上文提到的两套工作流的材质制作指南。
1. 反射值
图 62 展示了在 M/R 工作流中,非导体(电介质)材质的 F0 值范围与次世代 PBR 着色器之间的关系。比起金属材质,非导体材质会反射更少量的光。普遍非导体材质的 F0 值会在 2-5% 之间,对应的是 RGB 范围为 40-75,与 0.02-0.05 线性范围重合。
在图 63 中,你可以同时比较非导体的 F0 值和金属的反射值。对于金属材质来说,它们的反射范围是 70-100%,对应 180-255 sRGB。sRGB 与 Linear 空间之间的换算使用的是 gamma2.2 的近似值,具体可以参考第一章中的细节描述。
2. 正确/错误贴图比较
图 64 显示了在 M/R 工作流中,正确与错误贴图的示范案例。污垢在金属贴图中被示意为原始金属,而且 Base Color 中原始金属所对应的反射值被设定得太低,会导致这部分区域最终无法反射出金属应有的 70-100% 范围。
本文仅供学习参考之用,原文及图片版权归属 Substance 及其母公司 Adobe 所有。
参考文献:
- [1] McDermott, W. (2018). The PBR Guide. [PDF] Available from: https://academy.substance3d.com/courses/the-pbr-guide-part-1 [Accessed 12 November 2019]
- [2] Burley, B. (2012). Physically-Based Shading at Disney. [PDF] Available from:https:/disney-animation.s3.amazonaws.com/library/s2012_ pbs_disney_brdf_notes_v2.pdf [Accessed 5 July 2016].
- [3] Kwast, D. An Introduction to BRDF Models. [PDF] Available from:http://hmi.ewi.utwente.nl/verslagen/capita-selecta/CS-Jimenez-Kwast-Daniel.pdf [Accessed 5 July 2016].
- [4] Lagarde, S. (2014). ‘Dontnod Physically Based Rendering Chart for Unreal Engine,’ Sebastien Lagarde, blog post, April 14, 2014. Available from:https://seblagarde.wordpress.com/2014/04/14/dontnod-physically-based-rendering-chart-for-unreal-engine-4/ [Accessed 5 July 2016].
- [5] Lagarde, S. (2011). ‘Feeding a Physically-Based Shading Model’, Sebastien Lagarde, blog post, August 17, 2011. Available from:https://seblagarde.wordpress.com/2011/08/17/feeding-a-physical-based-lighting-mode/. [Accessed 5 July 2016].
- [6] Walter, B., Marschner, S., Li., H. and Torrance, K. (2007).Microfacet Models for Refraction through Rough Surfaces. [PDF] Eurographics Symposium on Rendering, 2007. Available from: https://www.cs.cornell.edu/~srm/publications/EGSR07-btdf.pdf [Accessed 5 July 2016].
- [7] Epic Games. (2004-2017). ‘Using Refraction’, Epic Games, UE4 Documentation, 2017. Available from:https://docs.unrealengine.com/latest/INT/Engine/Rendering/Materials/HowTo/Refraction/. [Accessed 5 July 2016]
- [8] 游戏引擎中基于物理渲染的基础部分(2). Available from: https://www.bilibili.com/read/cv346602/