外观
PBRGuide
摘要
Substance PBR Guide是Substance官方给出的PBR实践指导,主要从原理部分(Part 1)和实践部分(Part 2)阐述PBR的核心思路和Substance软件内的操作。对于新人TA以及想要了解PBR工作流程的设计师有一定程度的帮助。PDF目前并无中文版,不过原版的英文已经十分通俗易懂了,且Substance在PDF中十分啰嗦,逐字翻译毫无必要,因此这里给出阅读时的要点记录,感兴趣的同学可以直接阅读原文。
第一部分:理论基础
这一部分主要从原理简单阐述PBR理论,但原文并没有十分深入,可以作为深入学习的提纲。
光线
光线和介质表面交互的基本行为有反射和折射。光线从表面上反射出来,并向不同的方向移动,遵循反射定律,即反射角等于入射角。光线以直线的轨迹从一种介质传递到另一种介质即折射。常见BRDF对于光线和表面的处理只有反射。
吸收和散射
区分一些英文翻译:
Transparency:透明物
Translucency:半透明物
光在介质中传播的两种行为:吸收和散射。吸收会转换光的能量,但不影响方向。散射会随机改变光路但不影响强度。基于这两点,物体厚度必然会极大的影响光的吸收和散射。
漫反射和镜面反射
假设:
- 粗糙介质表面的反射会改变光的传播方向,但不改变强度。
- 折射会改变光路,用IOR(index of refraction)描述。
- 漫反射描述光从一个介质进入另一个介质,会在物体内部的多次散射之后,最终被反射会原介质。并且反射点近似在入射点。
漫反射介质带有吸收性,如果折射光前进太远会被吸收。所以,如果折射光确实出射此类介质,就可以假设他实际上只在物质内部行进了一小段距离,因此可以认为出射点和入射点相当接近。
而高散射和低吸收的材质通常指粒子介质或半透明介质,例如:烟雾,牛奶,皮肤,翡翠,大理石。后三者的渲染可以使用次表面散射模型,这一模型中入射点和出射点将无法被考虑为临近点。而更高散射和更低的吸收,则要使用更加昂贵的算法如蒙特卡洛积分。
注:事实上次表面散射才是普遍情况,微平面理论和次表面理论的区别在于关注的尺度不同。
微平面理论
在微表面理论中,漫反射和高光反射都取决于表面的不规则度。但是在实践中,由于材质内部的散射,粗糙度对漫反射的影响不大。因此,光的出射方向和表面粗糙度以及入射方向几乎无关。
在本指南中,表面的不规则程度被称为表面粗糙度。当然根据PBR工作流程不同,也有如roughness, smoothness, glossiness or micro-surface这类表述。但是都表示材质表面同一个方面:次像素级的几何细节。
微表面理论认为,介质表面是由一堆不规则的小平面组成的,这些小平面会基于自身的法线方向反射光线。只有表面法线准确等于光源方向和视线方向的半程向量时,才能反射可见光。然而,由于Shadow和Masking的存在,也不是所有符合条件的微表面都能有所贡献。材质表面的不规则度在微表面层级导致了光的漫反射。比如,模糊的反射是被散射的光线造成的。由于光并没有平行地反射,我们才会将镜面反射感知为模糊的。
色彩
材质表面的可见颜色是源于散射光源的波长。特定波长的光被物体吸收,剩下的部分就是我们看见的颜色。例如:苹果具有与光源颜色相同的明亮镜面高光,因为对于不导电的材料(电绝缘体)——如苹果皮——镜面反射几乎与波长无关。对于这些材质,反射光颜色是不会被材质表面属性影响的。
Substance使用GGX微表面散射:http://www.cs.cornell.edu/~srm/publications/egsr07-btdf.pdf
BRDF
BRDF即双向反射分布函数(bidirectional reflectance distribution function)用于描述表面的反射特性。在计算机图形学中,有不同的BRDF模型,其中一些并不是物理合理的。为了使BRDF合乎物理规律,则必须是能量守恒的且exhibit reciprocity。所谓Reciprocity是指Helmholtz Reciprocity Principle:入射光和反射光可以被视为对方的反转同时不影响BRDF的结果。
Substance的PBR着色器基于迪斯尼原则的反射模型,这一模型基于GGX,而GGX提供了一种更好的镜面反射方案:在高光区拥有更短的峰值和下降区更长的拖尾,因而看起来更加真实。
能量守恒
略
菲涅尔效应
在PBR中,Fresnel参数并不是像在传统流程中那样可以被随意控制的值,而是一个由PBR Shader完全控制的值。
当以掠射角观察表面时,所有的光滑表面将接近100%反射率。而粗糙表面会变得非常光滑但并非100%镜面反射。在这里,最重要的影响因素是微表面和光线的夹角而不是宏观表面和光线的夹角。因为光线是散布于各个方向的,所以反射显得更暗或者更柔和。宏观层次上的现象某种程度上类似于微观上Fresnel现象的平均。
F0(夹角为0度时的Fresnel反射)
当光线垂直入射表面时,一定百分比的光将被镜面反射。使用表面折射率就能推导出反射光总量,称之为F0。折射光总量即 1 - F0。常见绝缘体的F0通常是0.02到0.05。对于导体,通常范围在0.5到1.0。F0可以通过IOR计算得到,例如:
在制作贴图时,非金属的材质具有灰阶值,而金属是RGB值。通常来说,非金属的F0不会大幅变化。宝石类材质是例外。
导体和绝缘体
对于金属和非金属的简单划分可能无法准确归纳所有材质,比如准金属,不过对于创建材质而言,讨论金属和非金属是有效的方式。在设置材质基准线的时候,首先需要理解要创建什么。如上图:(各种材质的F0)。对于不透明材质,折射光被吸收了,且金属的颜色来自于反射光,因此金属没有Diffuse Color。
金属
对于抛光金属,反射率通常高达70-100%。一些金属吸收特定波长的光。比如黄金会吸收处于可见光谱高频区域的蓝色光,因此显示为黄色。因此在Specular/gloss工作流中,金属的Diffuse Map是黑色的,而Specular Map会带有颜色以表示金属的反射光色彩。
金属的另一个重要特性是腐蚀。这意味着风化和锈蚀会极大地影响金属的反射性质。在Substance中腐蚀区域将被作为绝缘体对待,即在Metallic贴图中标为黑色。Substance在Metallic工作流的Shader中硬编码非金属区的F0为4%。同时,喷漆的金属同样作为非金属对待。只有暴露在外的原生金属才会被当作金属着色。
非金属
非金属是电的不良导体。反射光被散射或吸收(通常会从表面再次发散),因此非金属比金属反射更少的光,而且有Albedo颜色。前面提到,根据IOR,大多数常见的绝缘体的F0在2%5%之间,确切讲是:0.0170.067(40~75 sRGB)。除了少数材质如宝石之外,大多数材质的F0值不会高于4%。
在材质中,需要使用基于物理测量的F0 值,但是对于非透明的材质,难以测量其IOR。但是大部分常见绝缘材质的F0值并不会变化太多,因此可以为一些常见材质设置基准线。
线性空间
线性空间渲染为光照计算提供了正确的数学基础,进而提供一个能以可信的现实世界法则表示光照交互的环境。线性空间的gamma是1,计算是以线性形式表征的。为了使线性渲染结果在人眼中显示正确,还需要做一次gamma矫正。人类的眼睛对光线变化的感知是非线性的,这意味着人眼的gamma高于1。人眼对于暗调的感知能力高于亮调。计算机的显示器基于此显示图像,因此我们能正确地感知色彩。
颜色值的计算和颜色操作应该在线性空间中进行。 该过程将伽马编码值转换为来自我们的颜色纹理的线性编码值,以及通过颜色选择器在监视器上查看时选择的颜色。 在颜色管理工作流程中,此过程通常涉及标记纹理贴图以解释为线性或 sRGB。 然后在线性空间(伽马 1.0)中执行计算,并在伽马编码空间 (sRGB) 中查看最终渲染结果。
在实际的材质制作和使用中,需要记住,表示颜色的纹理如:金属的偏色,玻璃的绿色等应该使用sRGB,而表示数据如区分材质表面粗糙度,或者是否是金属,这类纹理应该是线性的。
Substance系列软件会自动处理颜色转换。而一般情况下处理转换会依据以下公式:
if
then
otherwise
简化一下就是:
关键特性总结
- 能量守恒
- 反射光线永远不会比它第一次击中表面时的值更亮。 能量守恒由着色器处理。
- Fresnel
- BRDF 由着色器处理。 对于大多数常见的电介质,F0 反射率值的变化很小,在 2-5% 的范围内。 金属的 F0 值很高,范围为 70-100%。
- 镜面反射
- 镜面反射强度通过 BRDF、粗糙度或光泽度贴图和 F0 反射率值来控制。
- 线性空间
- 照明计算是在线性空间中计算的。 所有具有伽马编码值(例如基色或漫反射)的贴图通常由着色器转换为线性,但您可能必须在将图像导入游戏引擎或渲染器时通过检查适当的选项来确保正确处理转换 . 描述表面属性(例如粗糙度、光泽度、金属和高度)的贴图应设置为解释为线性。
第二部分:实践应用
第一部分在技术和原理上定义了PBR。在第二部分中将从实践角度解释PBR贴图并基于第一部分建立的基础提供一系列指导。这一部分将以艺术家视角重新定义PBR。PBR事实上是方法论而非标准。有不同的原则和方针,而非一套真理,这意味着可以有不同的实现。
Substance有以下两种工作流程,也支持任意定制化的管线。
什么是PBR
PBR是一种着色和渲染的方式,旨在提供更为精准的光照和表面交互的表现。基于讨论关注点的不同,分为PBR和PBS。PBS更关注着色过程而PBR关注渲染和光照。PBR的优点如下:
- PBR消除了创作表面属性(如镜面反射)的猜测工作,因为它的方法和算法基于物理上准确的公式。 因此,更容易创建逼真的美术资产。
- 资产在所有光照条件下看起来都很准确。
- PBR提供了一个工作流程来创建效果一致的艺术品,即使在不同的艺术家之间也是如此。
金属/粗糙度工作流
在金属/粗糙度工作流程中,金属的粗糙度也是和非金属区域的漫反射值一样存储在BaseColor中的。使用Metallic贴图区分金属区域和非金属区域以分别计算。非金属的F0是由shader控制而不是由材质纹理决定的。
金属的F0值来源于测量,而常见非金属的F0值是固定为0.04的,但艺术家仍然有需求去改变这个值以满足一些特殊的材质表现如宝石等。因此在Substance和Unreal中,Metallic工作流提供了“specularLevel”,用于改变对于区域的F0值。同时这个值在Substance中是0.0到0.08区间值,然后归一化到0-1区间。比如,0.5代表4%。
金属度工作流程的优缺点如下:
优点:
更容易处理贴图,且更少出现因为F0错误导致的问题。
由于Metallic和Roughness都是灰阶图,占用内存更少。
更容易被广泛使用。。。。
缺点:
一般无法直接控制F0,大多数电介质直接直接使用了4%。
贴图精度带来的边缘问题更加明显。
基础色贴图
Base Color存储两种数据:
- 非金属的漫反射值
- 金属的镜面反射值。
相比于传统贴图,Base Color纹贴图对比度更低,所以看上去会更加平均。同时也不建议将纹理值设置得太高或太低。在Substance中最低亮度的是煤炭,最高的是白雪,然而煤炭也并非是完全黑的。所以在实践中选择的亮度应该在一定的范围内。在提及亮度范围的时候,通常指非金属的反射颜色值。一个过黑的颜色例子如下图所示:
对于较暗的值,不应该低于30~50 sRGB。最低容忍值是30,一般应该高于50.
对于较亮的值,任何情况下都不应该高于240 sRGB。
对于金属,BaseColor所包含反射值应当来源于现实世界的实际测量值,大概在70%~100%之间。也就是说,这一部分的值在180到255sRGB。前面提到,对于非金属,BaseColor所包含的数据是反射光信息,因此不应该包含任何类似环境光遮蔽的信息。如果需要,应该使用一个单独的通道用于描述微平面层次的遮挡信息,也就是Micro-Occlusion。
总结:
- BaseColor纹理包含非金属的Albedo值,和金属的Reflectance值。
- BaseColor不应该包含光照信息,除非是微遮挡Micro-Occlusion。
- 暗部颜色值不应该低于30(宽松范围)到50(严格范围)。
- 亮部颜色值不应该高于240。
- 金属反射值在180到255之间。
金属度贴图
Metallic贴图用于定义哪一部分材质是纯金属。虽然压缩格式是线性灰度,它其实更像是一张遮罩图,它告诉Shader应该如何处理从BaseColor中获取的信息。因此Metallic应该包含二值化的信息,非黑即白,非绝缘体即金属。白色部分代表金属。 但是,白也有白的层次:
对于纯金属或抛光金属:
金属度值在235~255 sRGB之间
对应的BaseColor中反射率为70%100%(180255)。
对于非金属:
- 金属度为0
对于氧化或者蒙尘的金属:
金属度可以取一个中间值,只要低于235即可。
当一个区域的Metallic值低于235的时候,即这一部分不是纯金属或抛光金属时,需要将对应区域的BaseColor值变暗一些。
例如,在Substance Designer中可以这样处理:
粗糙度贴图
粗糙度也是线性的灰度图,描述了光线在物质表面的不规则扩散。思路直接来源于微平面反射理论本身。又由于能量守恒,改变反射光方向不会改变光的强度:反射光总量相同。这意味着粗糙表面有更大且更暗的亮点,而更光滑的表面则保持镜面反射的聚焦。
RoughnessMap的黑色(0.0)代表光滑,而白色(1.0)代表粗糙。这是最能体现材质也是最具有创造性的纹理。艺术家对此有完全的控制,但仍然建议从法线纹理开始创建。
分辨率和纹理密度
使用金属/粗糙度流程的副作用是,会在边缘产生白色伪影;而在镜面/光滑度流程中,则是会产生黑色伪影。其本质是纹理采样导致的插值,使得粗糙和光滑区域的交界线附近出现中间值。要缓解这一问题,只能尽可能地合理地为UV分配纹理密度。
镜面/光滑度工作流
镜面/光滑度流程同样是提供一组纹理给采样器,然后根据纹理信息处理得到PBR光照结果。镜面/光滑度流程提供了更加为人熟知的名词:Diffuse和Specular,但需要明确的是这和传统流程中的含义并不一样。Substance中使用Diffuse,而其他软件可能会使用Albedo。而其他纹理如AO,Height等,两个工作流都会使用。
在光滑度工作流中,金属的反射率值和非金属的F0值都存储在SpecularMap中,因此设计师可以控制两个RGB纹理:一个是Diffuse Color(Albedo),另一个是反射率值(Specular)。
PBR着色的基础是能量守恒,而这在光滑度流程中十分重要。但是SpecularMap提供了对F0的完全控制,这就导致Map中的值更容易出错。例如:Diffuse为1.0时,如果Specular也为1.0,那么反射和折射的能量将高于入射能量。
镜面/光滑度流程的优缺点
优点:
边缘伪影效应不那么明显
在SpecularMap中可以完全控制F0
缺点:
SpecularMap提供了对F0的完全控制,因此很容易出现错误。一旦在着色器中处理不正确,极有可能打破能量守恒。
增加了一张RGB纹理,使用了更多的内存
使用和传统流程相似术语却要求完全不同的数据,这可能带来一些困惑。同时对设计师的PBR理论水平要求更高。
漫反射贴图
光滑度工作流的DiffuseMap同样包含albedo即反照率颜色,但是不包含任何反射率值。漫反射纹理只包含反照率颜色Albedo,因此表示金属的区域就是黑色(0.0),因为金属没有DiffuseColor。而当金属出现氧化或污垢的时候,才应该包含颜色,此时不应被当作Raw Metal对待。
颜色仅表示非金属材料的反照率,金属为0.0 。
除了微遮挡外,基色不应该包含光照信息。
除了金属区域为0外,最暗值不应低于30sRGB(宽容范围)或50sRGB(严格范围)。
最亮值不应高于240 sRGB。
镜面反射贴图
光滑度流程的Specular Map是sRGB纹理,定义了金属的反射率和非金属的F0值。如同前文提到的,F0值应当来自于真实世界的测量值。电介质的F0值相对而言比较暗。在Specular流程中,金属的反射率值可以是彩色值,因为不同金属对不同波长的光的吸收不一样。
对于金属:已经多次说明了,原生金属的F0值应该来自真实数据。而对于氧化或是污损的金属,其DiffuseMap中的漫反射颜色应该提高,同时降低SpecularMap中的反射率值,以保证能量守恒。对于污损情况,污垢部分应该使用0.04即常规电介质的F0值。
对于电介质:电介质的F0值同样在SpecularMap中声明。设计师可以完全控制F0值,但注意要正确使用数据。在第一部分中曾提到:非金属(绝缘体/电介质)是不良导体。折射光线通常会被散射或是吸收,因此这些材料反射的光远少于金属。根据IOR计算得知,普通电介质的F0在0.02到0.05之间,宝石等特殊物体通常为0.08。
总结:
SpecularMap包含电介质F0和金属反射率
电介质的反射量少于金属,通常在0.02-0.05(线性)之间,即sRGB的40-70。
常见宝石在0.05-0.17(线性)之间,即sRGB的70 - 115
常见液体在0.02-0.04(线性)之间,即sRGB的40 - 56
常见金属在0.70-1.00(线性)之间,即sRGB的180 - 255。
如果不清楚特定材质的IOR,可以简单使用0.04,即sRGB的56.
光滑度贴图
光滑度贴图是线性灰阶图,描述了导致光线扩散现象的表面不规则性。黑色(0.0)表示粗糙表面,而白色(1.0)表示光滑平面。简单来讲,就是金属度流程中的粗糙度贴图的反转。
与金属度流程不同的是,光滑度纹理的过渡边缘会产生黑色伪影。这是因为原生金属没有Diffuse Color,那么过渡区域的像素会在非金属和金属之间插值,导致颜色偏黑,从而产生一个黑色条纹。
通用纹理
Ambient Occlusion
环境光遮蔽决定了表面上某一点可以访问多少环境照明。它只应该影响漫反射贡献而不影响镜面贡献。在UE4中,使用屏幕空间反射模拟局部的反射。AO最好是和屏幕空间反射结合使用。在Substance的PBR着色器中,由环境光贴图提供的环境光会乘上采样器得到的AO值。AO不应该烘焙到漫反射纹理中,只能独立提供给着色器。
在Substance中,AO可以从网格中烘焙或者使用工具从法线纹理中获得。此外还能使用HBAO节点基于高度获得HBAO(Horizon-Based Ambient Occlusion),其结果和光线追踪的结果类似。
Height
高度纹理通常用于置换效果,或是视差效果。相比于法线或是凹凸纹理,其能提供更加明显的深度,以得到更为真实的表现。Substance使用浮雕映射视差算法(Relief Mapping Parallax Algorithm)。与AO类似,高度图可以使用Substance的工具从网格中积分烘培得到。或者,在SD中,可以使用转换节点从法线获取高度。。。在SP中,可以直接绘制高度。
在实时着色器中使用HeightMap时,最好减少高度贴图中包含的高频信息。高度贴图被设计用于体现几何图形的整体轮廓,所以建议使用比较模糊的高度图来显示大致形状并减少其包含的高频细节,同时使用包含高频细节的法线去体现细腻的肌理。当然,在使用光线追踪着色器的时候,高度图是需要包含纹理细节的。
Normal
法线纹理使用RGB贴图格式存储XYZ各轴向上的表面法线,用于将高模的细节映射到低模上。在Substance中可以使用工具烘培或是从高度图转换得到法线。
PBR工具集
这一部分包含Substance提供的PBR工具
Substance Designer
PBR Base Material
这个节点是一个用于创建完整基材的实用程序,可以在材质滤镜>PBR实用程序下找到,如图所示。它支持金属/粗糙度和镜面/光泽度的工作流程,并为原始金属材料提供常见的预设。它还允许设置创建非金属时的反照率。根据工作流程有粗糙度和光泽度的控制,也有一个冗余量选项。也可以启用诸如基础色,法线等的输入。
Dielectric F0
这个节点输出普通介电材料的F0值,可以在材质滤镜>PBR实用程序下找到。可以从预设值中进行选择,并且该节点有一个IOR输入字段,该字段接受一个IOR并计算F0值。它是为电介质材料设计的,可以与镜面/光泽度工作流程一起使用 。
Metal Reflectance
该节点输出普通金属原材料的反射率值。在材质设计器库下的材质滤镜>PBR实用程序中找到它。可以从几个预设的金属值中进行选择,如图所示:
PBR Metal/Roughness/ Validate
这个节点被设计用于处理金属/粗糙度工作流,它是一个实用程序,用于检查基色和金属映射的错误值。它可以在材质滤镜>PBR工具下找到。节点输出一个红黄绿的热度图,红色是不正确的,绿色/黄色是正确的。使用金属,它检查基色中以金属表示的区域中相应的F0值(大于235sRGB)。热图显示了F0范围可能过低的范围。对于反照率,它会检查介电介质的亮度范围是否正确。
PBR Safe Color
此节点将修正基本颜色或漫反射贴图中的值,如图所示。它可以确保数值落在校正后的电介质亮度范围内。它可以在材质滤镜>PBR实用工具中找到。
Conversion
用于将金属度工作流程的纹理转换为其他渲染器所需的纹理,支持以下渲染器:
• Vray (GGX)
• Corona
• Corona 1.6
• Redshift 1.x *
• Arnold 4 (aiSurface)*
• Arnold 4 (aiStandard)*
• Renderman (pxrSurface)
Substance Painter
PBR Metal/Roughness Validate (Filter)
用于金属/粗糙度工作流程,检查基本色和金属地图的错误值。这个过滤器会输出一个红黄绿的热度图,其中红色部分是不正确的。对于金属区域,检查对应区域的BaseColor中的F0值是否过低。对于反照率,检查电介质的亮度是否处于合理范围。