Physically Based Rendering

"基于物理的渲染"

Posted by Ciel on May 30, 2019

记录一些PBR相关理论和知识

PBR基础理论

漫反射 & 镜面反射

Diffusion(漫反射)和Reflection(镜面反射),有时也被称为diffuse(漫反射光)和specular(镜面反射光)。

specular用于描述光线击中物体表面后直接反射回去,使表面看起来像一面镜子。有些光会透入被照明物体的内部。这些光线要么被物体吸收(通常转换为热量),要么在物体内被散射。有一些散射光线有可能会返回表面,被眼球或相机捕捉到,这就是diffuse light。diffuse和subsurface scattering(次表面散射)描述的都是同一个现象。

\img\in-post\pbr\reflection&diffuse

根据材质,吸收和散射的光通常具有不同波长,因此仅有部分光被吸收,使得物体具有了颜色。散射通常是方向随机的,具有各向同性。使用这种近似的着色器只需要输入一个反照率(albedo),用来描述从表面散射回来的各种颜色的光的分量。Diffuse color有时是一个同义词。

半透明 & 透明

在某些具有更长的散射距离的材质,比如皮肤、蜡、翡翠等材料里,一个简单的颜色通常不能决定一切,着色系统必须要考虑物体的形状和厚度。如果这些物体足够薄,这些物体通常会有一些光从一个表面入射以后一直散射,并从另一面射出,这个现象被称为透射(Translucent)。如果散射强度更低(比如玻璃),以至于散射的部分几乎可以忽略不计,那么物体另一侧的风景可以直接透过物体,进入人眼。这种现象和典型的“在表面附近”的漫反射差得十分远,因此通常需要专门的着色器来模拟它们。

能量守恒

基于上面这些,可以得出一个重要的结论:镜面反射和漫反射是互相排斥的。这是因为,如果一个光线想要漫反射,它必须先透射进材质里,也就是说,没有被镜面反射。这在着色语言中被称为“Energy Conservation(能量守恒)”,意思是一束光线在射出表面以后绝对不会比射入表面时更亮。

这个理论在着色系统中很好实现:只需要在漫反射被计算前从光线强度中减掉被镜面反射着色器处理的部分。这意味着高镜面反射率的物体只会显示出很少的漫反射光(也就是镜子不会有颜色,只会反射周围环境的颜色),因为只有很少量的光进入了物体里面,大部分光都被直接反射了。相反,如果一个物体有很强的漫反射光,那么它将几乎不会看起来有镜面反射。

\img\in-post\pbr\increasing reflectivity

这种能量守恒是PBR渲染的重要原则。这让美工在处理漫反射和镜面反射参数时不会无意间违背物理定律,或者在不同的光线条件下表现得差异过大。

金属

金属比一般绝缘体有更高的反射率。导体的反射率通常会高达60-90%,而绝缘体一般会低得多,在0-20%的范围内。这些高反射率使得大部分光线不能到达内部并散射,从而使金属拥有十分“耀眼”的外观。

导体的反射率有时会在可见光谱范围内变化(对不同波长光线的反射率不一致),这意味着它们的反射光出现颜色。这种反射光具有颜色的特质即使在金属中也是很罕见的,但它确实发生在某些日常材料(例如金,铜和黄铜)中。绝缘体一般来说并不表现出这样的效果,它们的反射光是均匀而无色的。

导体通常会吸收而不是散射穿透表面的任何光。这意味着在理论上,导体将不会具有任何漫反射光。然而,在实际情况下,在金属表面上通常存在氧化物或其它污渍,其将散射出少量的漫反射光。

正是金属与其它一切物质在这一点上的不同,导致一些渲染系统使用“metalness(金属性)”通道作为一个直接输入通道。在这样的系统中,设计师指定材料表现为金属的程度,而不是仅指定albedo和reflectivity通道。这有时候被认为是更容易创建PBR材质的一种方法,但这并不是PBR渲染的典型特征。

菲涅尔

在计算机图形学中,名词“菲涅尔(Fresnel)”被用于表达在入射角不同时,物体表面产生的不同反射情况。具体来说,相比垂直于表面入射的光线,贴着表面入射的光线更有可能被反射。这意味着使用合适的菲涅尔效果渲染的物体会在边角出显示出更强的反射。我们大多数人已经相当熟悉菲涅尔材质了,而且它在计算机图形学方面的存在也很久了。然而,PBR着色器在处理菲涅耳公式时做了一些已经被大家接受的重要修正。

首先,对于所有的材料,当光线贴着表面入射时,将完全被反射,任何光滑物体上的边缘都应该作为完美的(非彩色)镜子。如果它是光滑的,从正确的角度看,任何物质都可以成为完美的镜子,这可能违反直觉,但物理学上是这样的。

第二个关于菲涅尔属性的发现是,在不同的材质上,菲涅尔曲线的变化并不是很大。金属具有最不一样的曲线,但是它们也可以被统一到分析曲线里。这意味着,如果要做到真实的渲染效果,我们应该减少美术对菲涅尔参数的控制能力,而不是增加。或者至少知道设置默认参数为多少。

这样可以简化材质的制作流程。现在着色系统几乎可以完全自己处理菲涅尔效果;它只需要参照两个预先定义好的材质参数,比如Glossness和Reflectivity。

\img\in-post\pbr\fresnel

一个PBR工作流程使美术可以通过一种方式指定“基本反射率(Base Reflectivities)”。这提供了反射光的最小值和颜色。一旦渲染了菲涅尔效果,将在指定值之上增加反射率,直到在边角处达到100%(白色)。本质上,输入的数值描述了基础反射,菲涅尔的方程从那里接收基础值,使得表面在需要时按照角度变化增加反射光。

注意,菲涅耳效应随着表面变得不光滑,很快变得不那么明显。

微表面

上面关于漫反射和全反射的讨论还取决于物体表面的朝向。在宏观层面来说,这个朝向取决于被渲染的模型的形状,有时候这个模型也会添加一张法线贴图来更好地描述其表面细节。一旦提供了这些信息,任何的渲染系统都可以处理它们,并高质量地渲染漫反射和反射。

但是,还有一个问题没有解决。大部分真实世界的物体表面都有肉眼不可见的极小的缺陷:小槽,裂纹和凸起,这些缺陷即使对于法线贴图来说也太小以至于无法表达出来。虽然这些微观细节不能被裸眼观察到,但它们却会影响到光线的漫反射和反射。

\img\in-post\pbr\blurry

微观表面细节对反射的影响最为显著(次表面漫反射影响不大,这里不再深入讨论)。在上面的图表中,可以看到由于每一束入射光接触的表面朝向都不一样,平行射入的光在粗糙的表面变得分散。简而言之,表面越粗糙,反射光就会发散得越多,或者看起来越模糊。

不幸的是,评估每个用于着色的微表面特征在艺术制作、内存使用和计算方面都是禁止的。那我们该怎么办?事实证明,如果我们放弃直接描述微表面细节,而是指定一个一般的粗糙度度量,我们可以编写相当精确的着色器,产生类似的结果。这种测量方法通常被称为光泽度(Gloss)、光滑度(Smoothness)或粗糙度(Roughness)。它可以指定为纹理,也可以指定为常量。

这种微表面细节对任何材料来说都是非常重要的特征,因为现实世界充满了各种各样的微表面特征。光泽度映射并不是一个新的概念,但它在基于物理的着色中起着至关重要的作用,因为微表面细节对光的反射有很大的影响。我们很快就会看到,有几个与PBR着色系统改进的微表面特性有关的考虑。

第二个能量守恒

根据我们的假设,着色系统可以将微观细节考虑进去,并正确地处理反射光的分散,那么我们就需要重新认真考虑正确的反射光线总量。遗憾的是,很多旧的渲染系统都没能正确处理这一点,基于微观粗糙度反射了太多或者太少的光。

当等式被正确平衡以后,一个渲染器应该将粗糙表面的高光绘制得更大范围,同时比光滑表面更昏暗一点,而后者则有一个更小而锐利的高光。这个明显的亮度差别是关键:两个材质都反射相同数量的光(因为反射率相同),但是粗糙表面的材质将光线分散得很厉害,而光滑表面则反射了很集中的”电磁波“。

\img\in-post\pbr\increasing gloss

我们在漫反射/反射的能量守恒之外,必须考虑这第二个能量守恒。正确处理这个能量守恒是”基于物理“渲染技术更重要的一个方面。

微表面的影响

正是在上述知识的基础上,我们才真正认识到一个大问题:微观粗糙度直接影响到反射体现出来的亮度。这意味着艺术家可以直接在Gloss Map上绘制不同的灰度信息: 划痕、凹痕、磨损、抛光,各种信息 , 然后一个PBR系统不仅会显示反射形状的改变,并且会使得反射的强度也改变。不需要特定的反射遮罩。

这十分重要,因为在真实世界里两个在物理上联系的属性——微观细节和反射率,现在第一次在美术资源创作和渲染流程中被联系在一起考虑。这和之前讨论过的漫反射/全反射平衡很相似:我们可以单独指定这两个数值,但由于他们是相关的,尝试将其单独考虑反而会使得任务变得更难。

同时,对于真实世界材质的调查指出,材质的反射率(reflectivity)差别并不是很大(参照之前关于传导率的章节。水面和泥土就是一个很好的例子:两者拥有几乎相同的反射率,但由于泥土十分粗糙,而水面通常十分光滑,在反射上两者相差十分大。一个创建类似的PBR场景的艺术家会将两者的Gloss Map或者Roughness Map调得相差很大,而不是去调反射率,如下所示:

\img\in-post\pbr\microsurface

微观细节在其它方面对反射也有细微的影响。比如,在粗糙表面上,导致”边缘更亮“的菲涅尔效果会减少(粗糙表面的混沌性质”散射“了菲涅尔效应,因此观察者不能清晰地分辨出来)。同时,大而凹的微观表面可以阻碍光线——使得光线在两个表面间反射多次,增加了光线的吸收率并降低了亮度。不同的渲染系统以不同的方式和程度处理这些细节,但粗糙表面出现亮度降低的大趋势是相同的。

PBR艺术创作

新标准

由于计算能力的提高和对艺术内容标准化的普遍需求,快速成为游戏行业的标准,基于物理的渲染旨在重新定义我们创作和渲染艺术的方式。

基于物理的渲染(PBR)是指使用真实的着色/光照模型以及测量的表面值来精确地表示真实世界的材质。

PBR与其说是一套严格的规则,不如说是一种概念,因此PBR系统的实现往往会有所不同。然而,由于每个PBR系统都基于相同的基本思想(尽可能准确地呈现内容),因此许多概念可以很容易地从一个项目转移到另一个项目或从一个引擎转移到另一个引擎。

除了渲染质量,一致性是使用实测值的最大原因。这使得大家在创作的时候,可以多从艺术角度以及真实环境去考虑和预测创作结果。从艺术指导的角度来看,它也更容易确保由艺术家团队创作的内容在任何光照条件下都看起来很棒。

输入和术语

  • Energy Conservation 能量守恒

  • Albedo 反照率

反照率是基本颜色输入,通常被称为漫反射贴图。反照率贴图定义了漫反射光的颜色。PBR系统中的反照率贴图与传统漫反射贴图之间的最大差异之一是缺乏方向光或环境遮挡。方向光在某些光照条件下看起来不正确,而环境遮挡应该在单独的环境遮挡(AO)中添加。

反照率图有时定义的不仅仅是漫反射颜色,例如,在使用金属度图时,反照率图定义了绝缘体(非金属)的漫反射颜色和金属表面的反射率。

  • Microsurface 微表面

微表面定义了材料表面的粗糙程度或光滑程度。两者几乎没有区别,粗糙度可以用光滑度反转。

  • Reflectivity 反射率

反射率是一个表面反射光的百分比。所有类型的反射率(又称基本反射率或F0)输入,包括镜面、金属度和IOR,都定义了正面观察时表面的反射率,而菲涅耳定义了表面在掠入射角时的反射率。

重要的是要注意绝缘材质的反射率范围有多窄。结合能量守恒的概念,很容易得出结论,表面变化通常应在微观表面贴图中表示,而不是在反射率贴图中表示。对于给定的材质类型,反射率往往保持恒定。反射颜色对于绝缘体来说往往是中性/白色的,仅仅在金属的情况下才有颜色。 因此,在有专门金属贴图的情况下,可以丢弃专门用来描述反射强度/颜色(通常称为specular map)的贴图。

\img\in-post\pbr\specular vs metalness

当使用金属贴图的时候,绝缘表面在金属贴图中被设置为0.0(黑色)的像素,被赋予固定的反射率值(线性:0.04 sRGB:0.22),并使用反照率贴图作为漫反射值。对于金属表面在金属贴图中被设置为1.0(白色)的像素,镜面高光的颜色和强度取自反照率贴图,漫反射的值在着色器中设置为0(黑色)。金属贴图中的灰度值将被视为部分金属,并将从反照率贴图中取出反射率,并将漫反射值与该值成比例地变暗(部分金属的材质并不常见)。

再次强调,金属贴图不会比标准的镜面高光贴图更加精确。然而,这是一个可能更容易理解的概念,并且可以将金属贴图映射到灰度级插槽中以节省内存。在高光贴图上使用金属贴图的缺点是无法控制绝缘材料的精确值。

传统的高光贴图提供了对高光强度和颜色有更多控制,并且在尝试复制某些复杂材料时允许更大的灵活性。高光贴图的主要缺点是它通常被保存为一个24位的文件,这样会占用更多的内存。它还要求艺术家对物理材料的属性有一个非常好的理解,以获得正确的值,这可以是积极的或消极的,取决于你的观点。

金属贴图应该使用0或1的值(某些渐变可以用于过渡)。 像涂漆金属材质不应被设置为金属,因为油漆是绝缘体。金属值应代表材质顶层的属性。

IOR或者是定义反射率的另一种方法,它等价于specular和metalness输入。与specular输入最大的区别是IOR值是用不同的比例定义的。IOR标度决定了光相对于真空在材料中传播的速度。IOR值为1.33(水)意味着光在水中传播的速度比在真空空间中传播的速度慢1.33倍。

对于绝缘体,IOR值不需要颜色信息,可以直接输入索引字段,消光字段设置为0。对于有颜色反射的金属,您需要为红色、绿色和蓝色通道输入一个值。这可以通过图像映射输入来实现(其中映射的每个通道都包含正确的值)。还需要为金属设置消光值,通常可以在包含IOR值的库中找到这些值。

通常不建议使用IOR代替specular和metalness输入,因为它通常不用于游戏中,并且在具有多种材质类型的纹理中获取正确的值是困难的。

  • Fresnel 菲涅尔

菲涅尔是表面在掠射角对光反射的百分比。

菲涅耳通常应该设置为1(并且在金属反射率模块中被锁定为1),因为所有类型的材料在掠射角上都是100%反射的。微表面的变化会导致更亮或更暗的菲涅耳效应,这些变化会通过光泽度贴图内容自动计算出来。

在大多数PBR系统中,菲涅耳是由BRDF自动逼近的,通常不需要额外的输入。然而,对于Blinn-Phong BRDF,有一个额外的菲涅耳控制,这意味着使用它可能导致非物理精确的结果。

  • Ambient Occlusion 环境遮蔽

环境遮挡(AO)表示的是大规模被遮挡的光,通常是从3d模型中烘焙得到。

将环境遮挡添加为单独的贴图,而不是将其烘焙到反照率贴图和镜面高光贴图中,这样可以使得着色器能够以更智能的方式使用它。举个简单的例子来说,环境遮挡功能仅阻挡环境漫反射光,而不是来自动态光的直接漫反射光或是任何类型的镜面高光反射。

环境遮挡通常不应乘以镜面高光贴图或是光泽贴图中的值。将环境遮挡叠加在镜面高光贴图上可能是过去常见的技术,以减少不适当的反射(举个简单的例子来说,在渲染物体上对天空的反射),但是在现代的技术下,局部屏幕空间反射在表示物体间反射方面做得更好。

  • Cavity 空腔

空腔贴图表示小尺度的遮挡光,通常由3d模型或法线贴图生成。

空腔贴图应仅包含表面的凹的区域(凹坑),而不该包含凸的区域,因为空腔贴图的值会被乘以其他值。内容大部分应该为白色,较暗的部分表示光线被困住的表面凹陷区域。空腔贴图同时影响来自环境光源和动态光源的漫反射和高光。

或者,反射遮挡贴图可以被加载到空腔槽中,但是当这样做的时候,请确保将漫反射空腔值设置为0。

获取材质的值

\img\in-post\pbr\StandardShaderCalibrationChartMetallic

\img\in-post\pbr\StandardShaderCalibrationChartSpecular

创建纹理材质

为PBR系统创建内容的确切方法远没有最终结果重要,所以可以自由地进行试验,并找出最适合需求的方法。然而应该避免在特定的光照环境中调整材质的值使得它在这种特殊的环境下看起来更好。为材质使用可靠的基础值可以极大地简化过程,提高一致性和大型项目上的资产重用,并将确保资产无论在何种光照条件下总是看起来很棒。

一个取值参考:

对于每个材料我先反射率值,这些可以在网上各种图表,如果我不能找到一个反射率值一定的材料,我试着用逻辑推理来确定(即磨损橡胶会减少反光,黄铜是铜和锌的混合,等等)。

反射率值是最容易开始的,并为其他映射提供了良好的基础。对于绝缘体来说,重要的是要将数值保持在非金属通常反映的小范围内。对于金属,首先要使漫反射变黑,然后找到合适的反射率值是很重要的。在这之后,我将分配一个快速的粗糙度值,通常只排序为3类材料(闪亮,中等或粗糙)。然后我选择反照率颜色,注意保持一致,不要太暗。我还在不同的天空切换,以确保材料在各种照明条件下是一致的。一旦这个初始阶段结束,我就会依靠观察来微调这些值,因为每种材料都是不同的,记住PBR的概念。在这一点上,我喜欢添加一个基本的覆盖到法线贴图的材料,有一个强大的表面变化,如凹凸不平的塑料。

PBR:误解与改变

  • PBR并不一定要求有金属贴图,使用了高光贴图也不意味着不是PBR。

  • PBR基本概念是一系列复杂的处理真实物理和光照的渲染器的组合,以及一系列使用标准化的表示真实材质参数的贴图。本质上,PBR就是一个用于创建贴图和渲染工作的整体系统,在不同的工具和引擎的作用下会产生不同的实现效果(一般指渲染器模型和贴图的输入类型)。

  • 直接将非PBR贴图载入到PBR渲染器中进行渲染,并不能确保得到正确的真实效果。渲染器只是PBR中的一部分,要得到正确的真实效果,你还要考虑如何正确地校准以及使用PBR下的贴图。

  • diffuse和albedo这两个术语的意思本质上是相同的,即对象的基本颜色,并且经常可以互换使用。

  • 最大的不同之处就是现代渲染器下光照的计算方式非常高级。如今PBR使用了动态光源和实时阴影技术,以及提供了基于图像的光照技术(image-basedlighting)的精准环境漫反射和镜面反射。这也就意味着我们不用再去将光照、反射、阴影等直接绘制到贴图上。跟以往相比,我们就能将注意力转移到重现真实材质的属性上,而不用再去烘焙光照贴图。

  • 此外,线性空间渲染使得我们不用再在高光贴图中使用漫反射的补色来获得真实的白色高光,同时PBR微表面算法中的能量守恒(表面越粗糙,漫反射越强,整体明暗越亮)将不再需要我们手动在高光贴图中构造粗糙(更黑)和光滑(更亮)的区域。这就意味着高光贴图通常只用为每种材质类型包含比数值多一点的信息(表示绝缘体的灰度等级,表示金属的色彩信息),而大部分的变化则会交给微表面贴图来定义。

    \img\in-post\pbr\pbr

传统工作流和PBR Specular工作流

下图是一个黑暗环境下创建的枪

\img\in-post\pbr\traditional

  1. 漫反射太暗了,只能在特殊光照环境下才能获得非常好的效果。

  2. 环境光遮蔽(Ambient occlusion)和cavity细节直接绘制到了漫反射和高光贴图上了。AO/cavity应该通过单独的输入添加进去,这样能够让渲染器更加智能地使用它们。此外,大范围的AO更不应该直接添加到高光贴图中,因为阻挡光线并不等同于低反射表面(正如高光贴图所定义的那样)。

  3. 渐变映射贴图的信息也被绘制到了漫反射贴图和高光贴图中。渐变映射贴图可以当做用来手动创建遮罩实现局部效果的工具(比如角色更低区域的脏的信息),但这绝不是将它直接绘制到贴图中的理由。

  4. 这里使用的渲染器并不支持光泽贴图。这就意味着高光贴图必须同时尝试显示反射度和微表面细节,同时使用一个光泽度值来控制整体的材质效果。

  5. 这里使用的高光值是通过眼睛测量的,而不是真实材质属性。那么结果导致了金属部分反射太强烈,同时还毫无理由地偏黄,而且塑料和橡胶部分的材质没有足够的反光。

  • Tranditional->PBR Specular

\img\in-post\pbr\traditional to specular

首先,移除漫反射贴图和高光贴图中的光照信息和渐变映射信息。AO和cavity信息单独作为两张贴图,并放置到渲染器相应的位置上。然后,将漫反射贴图适当调亮一些。

由此,将高光信息(specular content)分解成一个光泽贴图和一个高光贴图。将原高光贴图中所有的表面信息移植到新建的光泽贴图中,然后更新这些值以使它们符合不同材质的微表面结构。如果光泽贴图已存在,那么再次确认这些值是否合理。例如,通常步枪底层的金属原料要比涂层的喷砂面更加平整/光滑,而光滑油漆层中的划痕则更显粗糙。

随着大部分纹理变化信息由高光贴图转移到光泽贴图上,我们就能将精力集中到反射率的思考和设置上。现在的关键点是区分物体哪些部分是金属材质,而哪些部分是非金属材质(当然,即便你并不使用metalness工作流)。理由非常简单,非金属的反射没有颜色并且反射率大概在4%的线性区间(或者#383838 sRGB),区间范围通常在2-16%(除了宝石以外很少有非金属会超过4%),与之相比金属的反射率则要高得多,一般介于70-100%。所以辨别清楚你所要表达的材质类型是非常重要的,这关乎找到正确的反射率值。

补充:如果金属物体被画上了或者涂上了其他不同的材质,那么在确定反射率值的时候就要作为非金属来考虑,除非是裸露的金属材质部分。

Specular工作流和Metalness工作流

这两种工作流之间最大的区别是如何在纹理映射中定义漫反射和反射率内容。在Specular工作流中,这些值通过两个惟一的纹理映射显式设置。

Metalness工作流程使用albedo map来定义漫反射和反射率的内容,metalness map来定义材料是绝缘体还是金属。原因是金属导电,这意味着大多数光子(即电磁波)会从表面反射出去,而任何穿过表面的光子都会被吸收而不是扩散,因此金属通常没有扩散成分。另一方面,绝缘体反射非常少量的光(约4%),大部分照射到材料上的光在表面扩散或反弹,形成均匀的颜色分布。

在实践中,这意味着大部分甚至全部(如果您的纹理只有金属或绝缘体,而不是两者都有)的漫反射或高光贴图将被浪费信息,因此金属化工作流通常更有效。然而,在同一纹理中存储漫反射和镜面反射内容的缺点之一是沿材质过渡的伪像。

\img\in-post\pbr\artifact

  • specular workflow 优点:

    • 扩散和反射率是两个直接的显式输入,对于有传统着色器经验的艺术家更友好。

    • 全色输入可以更好地控制绝缘体的反射率。

  • specular workflow缺点:

    • 容易使用不合逻辑的反射率值,导致结果不准确。

    • 比金属化工作流使用更多的纹理内存。

  • metalness workflow优点:

    • albedo定义了物体的颜色,不管材质是什么,艺术家从概念上更容易理解。

    • 将材料简化为两类:绝缘体和金属,不容易编写出不真实的纹理值内容。

    • 使用较少的纹理内存比全彩色高光工作流。

  • metalnesss workflow缺点:

    • 材质转换点会产生白色伪像。

    • 对绝缘体反射率控制较少。

    • 如果美术不理解工作流,很容易在metal map中使用不合逻辑的值,从而破坏这套工作流。

\img\in-post\pbr\create-metalness-map

  • SPECULAR -> METALNESS:
    • 首先,创建一个金属蒙版,根据表面的不同为所有材质指定一个黑色(非金属)或白色(金属)值。如果您有纹理的PSD,可以通过使用来自不同层的掩模内容来构建金属度信息来快速完成。你的金属材质贴图应该主要是白色和黑色,只有在有软过渡效果的时候才使用灰色值,比如污垢、灰尘、锈迹等等。灰色值也可以用于部分金属材料;然而,这些通常是相当罕见的。通常,当一个金属物体有任何一种涂层时,它起着绝缘体的作用。

    • 一旦你有了金属材质贴图,在Photoshop中创建一个新文件,添加漫反射贴图作为背景图层。然后,在上面添加高光层,并添加一个图层蒙版。将金属材质贴图粘贴到高光图层的图层蒙版中。您应该看到的是金属表面所在的镜面内容和绝缘体所在的漫反射内容,这意味着您对金属的工作流程有了正确的反照率映射。

\img\in-post\pbr\specular-to-metalness

  • METALNESS -> SPECULAR:
    • 从金属化工作流转换到高光工作流也很容易。我们只需要将漫反射和高光信息从反照贴图分割为显式漫反射和高光纹理。

    • diffuse map:将albedo map加载到Photoshop中,创建一个新的黑色的(#000000)填充图层,将metalness map粘贴到填充图层的图层蒙版中。

    • specular map:复制albedo map,并将其移动到填充层之上,创建另一个填充层其值为#383838,将metalness map粘贴到填充图层的图层蒙版中,反转图层蒙版。

\img\in-post\pbr\metalness-to-specular

创建指南

Metal / Roughness Workflow

在metal/roughness工作流中,金属的反射率值与绝缘体的反射颜色一起放在基本颜色映射中。掠射角的反射由BRDF来处理。使用一个金属贴图,它的工作原理类似于一个遮罩来区分基本颜色贴图中发现的金属和绝缘体数据。绝缘体F0值(0度菲涅耳反射率)不是手工创建的,由着色器处理它们。着色器在金属图中看到白色时,会显示反射率值。当着色器在金属图中看到黑色时,它将基本颜色图中的相应区域视为绝缘体,并使用4%(0.04)的反射率值。4%的值涵盖了大多数常见的绝缘体材料。金属的反射率值与绝缘体的反射颜色一起放在基本颜色图中。

普通绝缘体材料的F0通常设置为0.04(线性)4%的反射。在metal/roughness工作流中,这个值硬编码在着色器中。

一些金属/粗糙度实现,如在Substance toolset和虚幻4中,有一个specular控制,这允许艺术家改变绝缘体的常量F0值。实际上,这个输出被标记为“specularLevel”,并由金属/粗糙度PBR着色器中的纹理采样器提供。它表示0-0.08的范围,如图所示。这个范围在着色器中重新映射为0-1.0,其中0.5表示4%的反射。

\img\in-post\pbr\f0

  • Base Color (RGB – sRGB)

它的对比度低于传统的漫反射贴图。不会太亮或太暗。物体的色调往往比我们记忆中的物体要浅得多。我们可以把这个范围想象成最暗的物质是煤,最亮的物质是新鲜的白雪。煤是黑色的,但它不是0.0黑色。我们选择的颜色值需要保持在亮度范围内。

关于亮度范围,我们主要指的是绝缘体反射的颜色。如图,可以看到一个示例,其中污垢值已经低于正确的亮度范围。对于暗值,不应该低于30-50 sRGB。宽容一点是30sRGB,严格一点应该以50sRGB为界限。对于明亮的颜色,不应该有任何高于240 sRGB的值。

\img\in-post\pbr\basecolor

基色包含了绝缘体材料的反射光数据,因此它应该不包含诸如环境遮挡之类的照明信息。在着色器无法仅使用环境遮挡通道来表示此级别的细节的情况下,可以添加微遮挡,如图所示。然而,如果将微遮挡添加到场景中,它仍然需要亮度范围控制。图中表示金属反射率值的值应该从实际测量值中获得。这些值大约是70-100%的镜面反射率,我们可以将其映射到180-255的sRGB范围。

\img\in-post\pbr\ao

  • Metallic (Grayscale – Linear)

金属贴图的工作方式类似于蒙版。它简单地向着色器描述基本颜色中的哪些区域应该被解释为漫反射颜色(绝缘体),哪些区域表示金属反射率值。在metal map中,0.0(黑色- 0 sRGB)表示非金属,1.0(白色- 255 sRGB)表示原始金属。在实践中,当着色器查看金属映射并看到白色时,它会检查基本颜色映射中的相应区域,以获得金属的反射率值。

在这个范围内的金属区域需要在基本颜色图中有70-100%的反射范围,我们可以将其映射到180-255 sRGB,如下图所示。同样,这些值是基于实际测量数据。

\img\in-post\pbr\metalmap

在进行老化处理时,如氧化、灰尘、污垢。在这些情况下,金属需要作为电介质处理。涂过漆的金属也是绝缘体,如果其中部分油漆已被刮掉或削掉,则暴露的金属是未加工的(在金属映射图中为白色),而油漆是介电层(在金属映射图中为黑色),如下图所示:

\img\in-post\pbr\metalmap1

金属映射可以表示金属和非金属之间的混合状态,这种状态由金属图中的过渡灰度值表示。如果你将金属贴图保留为全白色,它会将这些底色的污垢区域作为金属的反射率值。污垢颜色值远低于表示抛光金属70-100%反射率所需的值,如下图。通过在金属图降低污垢所代表区域的金属映射值,可以在介电和金属反射率值之间创建适当的混合。

\img\in-post\pbr\metalmap2

污垢层的不透明度可以指示在底色中要降低多少反射率值。这里没有硬性规定。本质上,你是在从高反射率表面(导电)向低反射率表面(介电)移动。然而,这种转变的程度可能有所不同。

  • Roughness (Grayscale - Linear)

粗糙度图描述了引起光扩散的表面不规则性,如图所示。反射方向将根据表面粗糙度随机变化。这改变了光的方向,但是光的强度保持不变。粗糙的表面会有更大更暗的亮点。光滑的表面将保持镜面反射的聚焦,即使反射的光总量相同,镜面反射看起来也会更明亮或更强烈。

\img\in-post\pbr\roughness

粗糙度是一个高度主观的领域。可以通过法线贴图开始粗糙度。法线贴图通常包含关键的表面细节,这些细节也应该在粗糙度贴图中表示。

  • Resolution and Texel Density

使用metal/roughness工作流,会生成一个白色边缘。这个问题也发生在specular/glossiness工作流中。然而,在这种情况下,它几乎不可见,因为效果是相反的:有一个黑色的条纹而不是白色的。

\img\in-post\pbr\roughness1

\img\in-post\pbr\roughness2

这种边缘是由于纹理插值,并且在介电材料和非常明亮的金属过渡间存在鲜明对比时很明显。 如图所示。金属工作流中,基色包含更亮的金属反射率,该金属反射率使用非金属漫反射颜色进行插值,从而产生白色边缘。 对于镜面反射工作流,漫反射贴图包含黑色,因为原始金属没有漫反射颜色。 黑色值用非金属漫反射颜色进行插值,从而产生黑色条纹。

\img\in-post\pbr\roughness3

文档分辨率和纹素密度对边缘伪影的可见性有直接影响。 例如,如果使用硬边刷来创建金属和非金属之间的过渡区域,则低文档分辨率仍会使边缘变软,从而加剧伪影。 这种低分辨率问题也是由未按比例缩放的UV引起的,以根据文档分辨率提供足够的纹理像素密度。为UV提供良好的纹理像素密度是最小化任何边缘伪影的最佳方法,如图所示:

\img\in-post\pbr\roughness4

两个纹理集使用相同的2048像素分辨率。然而,右边的图片显示了一个低纹理密度的UV布局。文档分辨率和纹素l密度直接影响边缘的可见性。

  1. Base Color图是一个RGB图,表示非金属材料的漫反射颜色和金属的反射率值。

  2. Base Color图除了有微遮挡外,应该没有光照信息。

  3. Base Color图暗值不应低于30 sRGB(容忍范围)到50 sRGB(严格范围)。

  4. Base Color图亮度值不应高于240 sRGB。

  5. Metal Map图中原始金属的反射率将会很高,在70-100%的镜面范围内,我们可以映射到180-255 sRGB。一般来说,原始金属的灰度范围将在metal map中定义为235-255 sRGB。

  6. Metal Map还必须考虑到添加的污垢或氧化作用,在这些区域必须降低其值,比如灰色区域代表了污垢层。生锈的金属,涂过漆的金属被视为绝缘体,并在metal map中设置为黑色。

  7. 如果Metal Map中的值低于235 sRGB,则需要在Base Color图中降低反射率值。

  8. 纹素密度和分辨率会影响工作流程中可能出现的白边。为了最大限度地减少伪影,请确保UV提供足够的密度以匹配文档分辨率。

Specular / Glossiness Workflow

\img\in-post\pbr\specular

在这个工作流程中,金属的反射率值和非金属材料的F0被放在高光贴图中。使用specular/glossiness工作流,有两个RGB映射:一个用于漫反射颜色(diffuse/albedo),另一个用于反射值(specular)。使用高光贴图,可以在贴图本身中控制介质材料的F0。

因为高光贴图提供了对介质F0的完全控制,映射更容易包含不正确的值。例如,白色(1.0)漫反射和白色(1.0)高光值可以结合起来反射/折射比最初接收到更多的光,这违反了能量守恒定律。因此,当创建纹理时,纹理数据将不会与实际结果相对应。

  • Diffuse (RGB – sRGB)

与来自metal/roughness工作流的基本颜色映射一样,漫反射映射包含反照率颜色。然而,它不包含任何反射率值。

漫反射贴图只是反照率的颜色。表示原始金属的区域将为黑色(0.0),因为金属没有漫反射颜色。在发生氧化的情况下,金属区域将包含颜色,因为它不再作为原始金属处理。同样的道理也适用于污垢或其他在金属表面形成介电层的效果。

\img\in-post\pbr\specular1

漫反射贴图在色调方面的指导原则与基本颜色贴图相同。例外情况是,如果存在原始金属,则允许值0.0(黑色),并且不受黑暗范围指南的控制。

  • Specular (RGB – sRGB)

高光贴图定义了金属的反射率值和非金属的F0值。此RGB映射允许在映射中创建介质材料的不同值。这与金属/粗糙度工作流程不同,在金属/粗糙度工作流程中,介质以4%的反射率进行硬编码,只能通过窥平通道进行修改。正如我们在metal/roughness工作流中所述,F0数据应该来自真实的实测值。用于介质的F0将是一个较暗的值。由于某些金属吸收不同波长的光,金属的反射率可以被着色。介质和金属的F0都是在RGB高光贴图中创建的。

\img\in-post\pbr\specular2

由于高光贴图包含金属和非金属的F0值,我们将把贴图分成每种材质类型的单独类别。

对于金属:污垢或氧化会提高漫反射贴图中原始金属的漫反射颜色,降低高光贴图中的反射率值,如图所示显示了原始金属上的污垢层。高光图中的污垢包含介质的适当F0值。在这种情况下,我们使用0.04或4%。

\img\in-post\pbr\specular3

对于电介质:非金属(绝缘体/介质)是较差的导电体。折射的光被散射或吸收(经常从表面重新出现),因此这些材料反射的光比金属少得多。根据折射率(IOR)计算的F0,除宝石外(0.05-0.17),普通介质材料的F0可以在0.02-0.05(线性)范围内。

\img\in-post\pbr\specular4

  • Glossiness (Grayscale - Linear)

光泽度图描述了表面不规则性。 在该图中,黑色(0.0)表示粗糙表面,白色(1.0)表示光滑表面。 它是金属工作流程中粗糙度图的反转。 此图具有与上述粗糙度部分相同的艺术指导。

  • Resolution and Texel Density

同样,文档分辨率和纹素密度对边缘伪影的可见性有直接影响。 如果使用硬边刷来创建金属和非金属之间的过渡区域,则低文档分辨率仍会使边缘变软,从而加剧伪影。 这种低分辨率问题也是由未缩放的UV引起的,以提供与文档分辨率相比足够的纹理像素密度。 为UV提供良好的纹理像素密度是控制此问题的最佳方法。

\img\in-post\pbr\specular5

  1. Diffuse图表示非金属材料的反照率,黑色(0.0)表示原始金属。

  2. Diffuse图除微遮挡外,不应包含光照信息。

  3. Diffuse图暗值不应低于30 sRGB(容忍范围)或50 sRGB(严格范围),除非原始金属是黑色的。

  4. Diffuse图亮度值不应高于240 sRGB。

  5. Specular图包含介质的F0和原始金属的反射率值。

  6. 介质比金属反射的光少。普通介质的F0在2-5%左右。对于sRGB,其值应该在sRGB 40-75之间,与0.02-0.05(线性)范围重叠。

  7. 普通宝石在0.05-0.17(线性)范围内。

  8. 普通液体在0.02-0.04(线性)范围内。

  9. 原始金属的反射率值会很高,在70-100%的镜面范围内,我们可以映射到180-255 sRGB。

  10. 如果找不到特定材料的IOR值,可以使用4% (0.04 - 塑料)。

  11. 纹素密度和分辨率会影响工作流程中可能出现的白边。为了最大限度地减少伪影,请确保UV提供足够的密度以匹配文档分辨率。

Maps Common to Both Workflows

  • Ambient Occlusion (AO)

环境遮挡图定义了一个表面点可以获得多少环境光。它只影响漫反射的贡献,而不应遮挡高光的贡献。一些引擎,如虚幻4,可以选择屏幕空间反射来模拟局部反射。最好的组合是使用AO与屏幕空间反射。可以使用网格烘焙或者通过法线贴图生成。

\img\in-post\pbr\ao1

  • Height

高程贴图通常用于绘制位移。它可以用于视差映射,帮助添加更多的表观深度,从而更现实的正常和凹凸映射。可以使用网格烘焙或通过法线贴图生成或者直接绘制(使用Substance Designer或Substance Painter)

关于将高度与实时着色器一起使用,最好减少图中包含的高频细节的数量。 高度贴图应设计为表示用于移动几何体的形状的整体轮廓。一个好的做法是使用模糊版本的高度来显示表格并减少任何高频细节, 用法线贴图提供高频细节。如果在光线跟踪渲染器中使用高度作为位移,则需要此高频细节。

\img\in-post\pbr\height

  • Normal

法线贴图用于模拟表面细节。它是一个RGB映射,其中每个组件对应于曲面法线的X、Y和Z坐标。它可用于将高分辨率模型的投影细节存储到低分辨率模型中。可以烘焙法线或将高度映射转换为法线映射或者使用工具绘制。

Substance PBR Utilities

  • Substance Designer

    • PBR Base Material:Material Filters > PBR Utilities

    • Dielectric F0

    • Metal Reflectance

    • PBR Metal/Roughness Validate:此节点输出一个从红色>黄色>绿色移动的热图,其中红色不正确,绿色/黄色正确。对于metal,它检查metal map中表示为metal的区域(大于235 sRGB)的基本颜色中对应的F0值。热图显示了F0范围可能过低的范围。对于反照率,它检查电介质亮度范围是否正确。

    \img\in-post\pbr\substance1

    • PBR Safe Color:此节点纠正基本颜色或漫反射映射中的值。它确保数值在介质的校正亮度范围内。

    \img\in-post\pbr\substance2

  • Substance Painter

    • PBR Metal/Roughness Validate (filter):要在Painter中使用此功能,需要导入到Substance Painter项目中,并将其标记为Filter,或者复制到Filter folder中。

    • 输出文档

附图

\img\in-post\pbr\1

\img\in-post\pbr\2

\img\in-post\pbr\3

\img\in-post\pbr\4

\img\in-post\pbr\5

参考链接

https://marmoset.co/posts/basic-theory-of-physically-based-rendering/

https://marmoset.co/posts/physically-based-rendering-and-you-can-too/#create

https://marmoset.co/posts/pbr-texture-conversion/#metalvspec

https://academy.substance3d.com/courses/the-pbr-guide-part-1

https://academy.substance3d.com/courses/the-pbr-guide-part-2