为美好的 PBR 献上祝福

为美好的 PBR 献上祝福

简介

这篇文章只是我这样一个爱好者写的,写的很急,可能有些东西表达不到位。

这篇文章不是给技术大佬看的,就是个人的学习小总结,一次表达的尝试。

也为了避免误导大家,推荐大家最好的是去看资料引用里的文章,那才是写得又硬核又高可读性!

所以有不对的地方请指正请轻喷,当然,有大佬指正小弟巴不得呢!

作者:JaylanWood

联系作者:jaylanwu@outlook.com

转载需声明来源。

开头上道硬菜

个人认为,看懂这个图是最关键的,它描述了金属和非金属的反射值的变化。

Screen Shot 2020-04-17 at 08.19.26

金属还是非金属 这有个diffuse问题

纯金属没有 diffuse,有 diffuse 的都是有杂质。

来,做金属

金属-Gold

给做个纯金,你看这个24K纯金球又大又圆。

只有 glossy 做能量贡献。

来,做非金属

非金属

由 Fresnel 分配 diffuse 和 glossy 的能量贡献。

来,给金属来点 diffuse 尝尝

Gold_with_diffuse

完了,这金做出全是杂质了,不值钱了!

为什么呢

Screen Shot 2020-04-17 at 05.14.42

Screen Shot 2020-04-17 at 05.19.07

看懂了吗?!看到金属里那个红色的叉了吗?金属根本没有 diffuse!

引用龚大的话:

对于金属来说,diffuse永远是0,材质的颜色来自于 specular。对于非金属来说,材质的颜色一部分来自于diffuse,一部分来自于specular。

Fresnel 和 F0

img

反射值随着光线与物体法线的夹角变化而变化,夹角从0到90度,非金属物体反射值从 0.02-0.05 到 1,金属物体反射指从 0.5-0.9 到 1。

1.Everything has Fresnel

来看看 Frenel 到底是怎么回事

用 Emission 来展示 Frenel 是怎么表达从 F0 到 F90(好像没F90这说法,反正我就这么叫了)

来看看Fresnel是怎么回事

F0 到 F90,由黑到白,这里展示了 IOR 是1.45 的 Fresnel 反射强度变化(只不过这里是用自发光Emission来展示,以免受到其他灯光影响)

来看看非金属没有 Fresnel 会怎么样

非金属-没有Fresnel会怎样

Oh, shit! 所有角度的 Glossy 都一样强。

于是,很多人将错就错做出了下面这样的错误材质

非金属-错误的做法

什么?你说你没发现错在哪里?也没见过这种错误的做法?来看看 vray 版?

WechatIMG9

看看那些风骚的错误操作:

  1. 把 Fresnel 关掉。
  2. 关掉也就算了,也不见在 Reflect 里把 Fresnel 反射曲线给弄出来。
  3. 把 Reflect 降低,看起来好像做对了,实际上已经错了。所有角度的反射值都统一降低了。

不知道什么是 Fresnel 反射曲线?看图

Screen Shot 2020-04-17 at 08.19.26

看到起始点在 0.9 以上的吗?那是大部分金属的反射变化。

看见起始点在 0.2 左右的吗?那是钻石,知道为啥它能闪瞎钛合金狗眼了吗。

看到起始点在 0.05 以下的吗?那是非金属的反射变化。

题外话:知道为啥 substance 要把非金属 F0 设置为 0.04 了吗?!

还看不出来问题?没有对比就没有伤害!

Fresnel Combine

不管是金属还是非金属,都是有 Fresnel,记住:

Everything has Fresnel

当然,跟随角度变化而变化的,不止反射强度,还有反射模糊,为了好理解,这里就不展开说了。

2.那么F0是怎么算出来的呢

上公式:

IORtoF0equation

公式里的 n 是 IOR,知道 vray 的 IOR 咋回事了吧。

代入水的IOR=1.33,得到F0是0.02:

IORtoF0equationWater

能量守恒(Energy Conservation)

1.能量守恒啥意思?

散射(diffuse) + 镜面反射( glossy/Reflect/Specular Reflection)<= 入射(光源)

注意:Blender 的 glossy 在 vray 里是 Reflect,一个意思,就是镜面反射(Specular Reflection)。

2.举个能量不守恒的反例

BRDF 基本都能量守恒,即便是上面 “金属加了diffuse” 和 “没有Fresnel的错误材质”,也是能量守恒的。

要说明能量不守恒是怎么回事,得找个反例才一目了然,得让 diffuse保持不变 + Specular增加 > 入射(光源),这样的反例才最能说明能量不守恒的表现。

一时半会想不到去哪整个反例,以后有机会再写这个。

3.资料引申

引用《THE PBR GUIDE - PART 1》

能量守恒在PBR渲染中起到至关重要的作用。这个原则认为一个表面二次发射(反射或散射)的光必须少于这个表面接收到的光。换句话说,从表面反射的光将永远不会比入射到表面之前更强烈。

英文原文:

Energy conservation plays a vital role in physically-based rendering solutions. This principle states the total amount of light re-emitted by a surface (reflected and scattered back) is less than the total amount received. In other words, the light reflected from the surface will never be more intense than it was before it hit the surface.

金属度(metalness)

1.金属度是个啥?物理书上有写?我读书少,你别骗我!

好好好,不骗你,物理书确实没写金属度,来看看技术大佬们是怎么说的:

UNDERSTANDING METALNESS 中 Christopher Nichols 访问 Autodesk 着色器技术专家 Zap Andersson 的音频片段翻译,采访音频时间长达1:08:32,从39分开始讨论到金属度。

译者:JaylanWood

译文:

Christopher Nichols:在现实世界中,没有东西既是金属又是非金属的,对吧?

Zap Andersson:没错。意图是,当你使用此功能时,实际上是要更多地将金属度(metalness)这个参数当作是遮罩(mask)来使用,仅此而已。

Christopher Nichols:当作遮罩,是吗?

Christopher Nichols:所以,(金属度)那些中间值存在的理由是为了抗锯齿(aliasing)?

Zap Andersson:基本上是的,仅此而已。

Christopher Nichols:所以它是金属和非金属的遮罩。

Zap Andersson:我的意思是,举个例子。比如说 substance painter,做一把战斧,它是一个一体的模型,上面只有一种材质,所有东西都在纹理中。因此,战斧的手柄是木头材质,战斧的斧头是金属材质。所以斧头上的金属度是1,手柄上的金属度是0。那么在它们衔接之间的一些抗锯齿像素中可能是0.5。

Christopher Nichols:对。

Zap Andersson:这就是正确的使用方式。

Christopher Nichols:但是人们不一定理解这一点。

Zap Andersson: 确实可能是这样的。有的人调一个0.35金属度,还指望它是科学的,但事实并非如此。

Christopher Nichols:确实不科学。

Zap Andersson:绝对不是。

抗锯齿和遮罩的说法确实是很新奇,从图像角度解释了金属度中间值。

2.金属度并不是一个完全的物理学上的东西

来看看《The PBR Guide》对金属度贴图的描述:

图26

Figure 26: Base color map contains reflectance values for raw metal as indicated by the metal map

金属贴图中并没有包含直接被材质引用的真实世界的数据(如反照率颜色、反射值等),它只是比较简单地对着色器描述Base Color中的哪个区域应该被解析成反照率颜色(非导体),哪个区域应该被描述成金属的反射值。

在金属贴图中,0.0(纯黑-0sRGB)代表了非金属,而1.0(纯白-255sRGB)代表了原始金属。当金属贴图被用于定义原始金属与非金属时,一般都是二态的:纯黑或纯白,意味着材质除了原始金属就是非金属。在实现过程中,当着色器监测到金属贴图中的白色区域时,它会检查 Base Color 贴图中相应的位置来获取金属的反射值并进行渲染(如图26)。

事实上,PBR 把 diffuse 和 Specular Reflection 2个通道合成一个 Base color 通道。

  • 当一个材质是纯非金属材质时候,固有色(Base color)是漫反射率(Diffuse),镜面反射率不做说明的话是固定值。
  • 当一个材质是纯金属材质时候,固有色(Base color)是镜面反射率(Specular Reflection),漫反射率是0。
  • 当一个材质处于以上两者之间时,固有色(Base color)会同时影响两个反射率(Diffuse 和 Specular Reflection)。

为啥这样做?

因为纯金属不需要diffuse。

纯非金属固定镜面反射率(Specular Reflection)从 F0的0.04 到 F90的1,只需要diffuse就行。

3.金属度说得笼统点,不就是 F0、Fresnel 的简化。

金属度更多的是传统 GGX BRDF 的简化,把非金属的 F0 写死 0.04,美术们就不会违反能量守恒了。

金属度并不是一个完全的物理学上的东西,1是金属,0是非金属,0-1之间是半导体。日常生活中基本上没有半导体,但是铁锈材质贴图里的0-1之间的灰度又是怎么回事?

substance 里生锈材质的金属度就是0-1之间的,生锈材质它算不上是半导体。不过从微观层面,铁锈确实是金属和非金属混在一起。

substance《The PBR Guide》有专门提到生锈材质:

  1. 金属被氧化、腐蚀、上漆、覆尘后,这些区域需要被当做非导体(电介质)材质来看待。
  2. 在金属贴图中,纯黑(0.0)代表了非金属,纯白(1.0)代表了金属,我们可以用过渡的灰阶来表示不同程度氧化和污垢。
  3. 如果金属贴图中有值低于235 sRGB,那么在Base Color中对应区域的反射值也应该降低。

PBR 是传统 GGX BRDF 模型的简化限制版

精简

把 F0、Fresnel 这些复杂的东西做成了金属度(metalness),美术人员按照原始金属1、非金属0、生锈0-1 去考虑金属度就能把材质分清楚了。

限制

在金属工作流(Metal/Roughness Workflow)里,默认把非金属的 F0 设置在 0.04,美术人员想改都改不了,彻底杜绝破坏能量守恒定律的可能,保证了PBR的基于物理。

更省通道 更省内存

把 漫反射和反射 合成 金属度,并且金属度是灰色贴图,从程序角度,不就是省了通道省了内存嘛,游戏流行 PBR 啊。

为什么我觉得金属工作流是 PBR 的精髓

1.来看看金属工作流(Metal/Roughness Workflow)

优势

  1. 在金属工作流中,由于非导体(电介质)的F0都是规定好的,所以设计师在对非导体F0赋值时不易出错。
  2. 纹理的缓存压力更小,因为金属贴图和粗糙度贴图都是灰度贴图。
  3. 目前来说是兼容性最广的工作流。

劣势

  1. 非导体(电介质)F0 的值固定为4%,无法调整。然而,在大多是实现流程中都有控制器可以直接复写这个值,所以也不能算硬伤。
  2. 白色边缘问题较明显,尤其在低分辨率的情况下问题突出。

2.来看看镜面反射工作流(Specular/Glossiness Workflow)

优势

  1. 边缘效应不会那么明显。
  2. 可以在镜面反射贴图中对非导体(电介质)材质的F0值自由调整。

劣势

  1. 由于在镜面反射工作流的镜面反射贴图中,非导体(电介质)材质的 F0 值是可以自由调整的,所以也会导致设计师容易输入错误的值。而这些错误的值被着色器误读后可能会打破能量守恒定律,从而造成不正确的渲染效果。
  2. 由于新增了一张RGB通道的镜面反射贴图,所以对性能消耗会更大。
  3. 镜面反射工作流有些名词和传统的工作流太相似,但是实质所对应的数据可能是不一样的,因此会导致设计师容易误解或误操作。这种情况下就要求设计师有更好的PBR理论知识,例如了解非导体(电介质)的正确F0值,金属在漫反射色下表现为纯黑,以及在着色器没有自动校正情况下,能量守恒相关的基础知识。

3.为啥?因为镜面反射流可以乱调 F0 啊!

因为镜面反射工作流(Specular/Glossiness Workflow)是可以调整 F0 的,就是 Specular 这个参数可以调 F0,调的不好就打破了能量守恒和 PBR。

所以说,在 PBR 里用 Specular 工作流的人基本都是大神,他们能根据现实材质的需要把 0.02-0.05 之间这么细微的 F0 给准确测出来,他们不满足于锁死的 F0。

为美好的 PBR 献上祝福

作为半吊子爱好者,学啥啥吃力,一直觉得传统 GGX BRDF 调个材质跟研究物理光学似的,一不小心看到别人在 vray 把 Fresnel 去勾,就觉得很难受。

感谢 PBR 带来的方便,再也不怕脑子不够用了。为美好的 PBR 献上祝福!撒花!

资料参考

金属,塑料,傻傻分不清楚

作者:叛逆者

简介:微软图形大神龚敏敏出品的文章,说得很透测。

UNDERSTANDING METALNESS

作者:Christopher Nichols

简介:一篇来自 Chaos Group Labs 的主管 Christopher Nichols 的博客,在文章结尾还附有 Christopher Nichols 访问 Autodesk 着色器技术专家 Zap Andersson 的音频,时间长达1:08:32,从39分开始讨论到金属度。

THE PBR GUIDE - PART 1THE PBR GUIDE - PART 2

作者:Adobe Substance 官方

简介:Adobe Substance 官方出品的 PBR 指导手册,可能是目前最好的 PBR 资料。