美术至少该知道PBR的什么?

2022-1-19 17:46cgsd 73 0

一、光与物体

我们能看见一个物体,是因为光照射物体、经过种种过程后又返回到我们的眼睛。返回眼睛的光的强度、颜色等,决定了我们所看到的最终成像。

我做了一个简化的概念,如图1-1。

图1-1

光落在一个物体上,有一部分光在物体表面直接反射离开,这部分光称为“镜面反射”;剩下的光进入物体内部,有些被物体本身“吸收”,转换为内能;还有一部分在内部折射后再次射出,这部分称之为“漫反射”。

上面说过,我们看见一个物体,是由它所返回我们眼睛的光强度和颜色等决定的。在上面的三个光路分析中,“漫反射”和“镜面反射”是进入我们眼睛的,“吸收”是消失的。所以我们先持有一个粗略的概念:我们看见一个物体,就是因为它的镜面反射和漫反射。


二、金属与非金属

PBR的核心就是将物质区分为金属和非金属,这是由于导体与绝缘体对光子不同的物理属性所导致的。物理什么的我们按下不提,我会用更直观的方法来说明为什么要做这样的区分。

上面我们提到过,镜面反射和漫反射决定了我们看见一个物体。

对于一个金属来说,它的镜面反射率是非常高的(70~100%)。也就是说,光落在一个金属上,绝大多数直接被镜面反射、剩下的被吸收,几乎没有任何光通过漫反射再射出。

而对于一个非金属来说,它的镜面反射率是很低的(2~5%)。也就是说,当光落在一个非金属上,绝大多数光都进入了物体内部,其中一部分被吸收,另一部分作为漫反射射出。

所以我们很容易得出一个结论:金属的最终效果取决于镜面反射,非金属的最终效果取决于漫反射。


那么接下来的问题就是,漫反射和镜面反射是如何被程序模拟的?

前面我们说过,最终成像是由返回给你的光的强度和颜色所决定的。所以其实程序的模拟就是两个值“强度”和“颜色”。

对于镜面反射而言,除了“镜面反射率”决定了它的反射光总强度之外,还有一个“表面粗糙度(roughness)”决定了它的实际反射效果。即,表面越粗糙,我们所看到被反射出来的光越分散;表面越光滑,反射的光越集中(如图2-1)。

图2-1

需要注意的是,实际上它们所反馈给我们的镜面反射总量是相同的——这个总量取决于镜面反射率(即有多少占比的光被直接反射了),和粗糙度无关。

并且,虽然展示图用的是一个白膜,但是实际上镜面反射是有颜色的,这个颜色取决于物体本身的材质。

对于漫反射来说,它的强度取决于“镜面反射率”和“吸收率”,也就是除了镜面反射和吸收之外,剩下的就是漫反射。很好理解的是,漫反射也是有颜色的,它的颜色同样取决于物体本身的材质。

还有一点值得注意的是,因为颜色数据存储的特殊性,所以我们可以将“强度”和“颜色”当作同一个属性存储,因为颜色的灰度就相当于它的强度。


所以我们很容易得到结论,我们要模拟一个光照效果,需要的数据其实非常简单:镜面反射颜色(强度)、漫反射颜色(强度)和表面粗糙度。


三、神奇的F0与菲涅尔

相信大家都听过pbr里一个迷惑的概念:F0。实际上,这是一种经验性的规定。

我们观察到一种现象,当物体与你的视角夹角不同时,物体的镜面反射率是不同的,理论上你视角与物体的夹角越大,物体的镜面反射率越高、并无限趋近于100%(如图3-1)。

图3-1

这一条将附加到之前的概念里——上面我们所提到的所有“镜面反射率”,都是指掠穹角下(即你垂直观察物体)时的反射率。当你的视角与物体发生偏转,这个值是在递增改变的。

从某种简化的理解上来说,神奇的F0就是“镜面反射率”。它是指物体在绝对垂直于视角情况下的镜面反射率。


四、pbr是怎么做的

众所周知PBR有两套流程,一套名叫“金属度/粗糙度”流程,一套叫“镜面反射/光泽度”流程。

我之所以没有从一开始就把这两套流程拿出来叭叭,其实是因为这两套流程本质上是相同的。实际上我们所用到的信息都是“镜面反射颜色,漫反射颜色和表面粗糙度”。


金属度/粗糙度流程当中,我们使用三张贴图来储存上面所提到的信息。

(1)反照率贴图(Albedo)(RGB)

这个名字给人造成了巨大的迷惑,所以我们直接撇开“反照率”这个物理名词不谈。实际上,这张贴图里存储的是“金属的镜面反射颜色 和 非金属的漫反射颜色”

你几乎可以粗略的将Albedo理解为“Color”——我们之所以不用传统的“漫反射颜色”这个词来命名它,仅仅是因为这里存储的是金属的镜面反射颜色而非漫反射颜色。我觉得更好的翻译应该叫“反射颜色贴图”,直接把镜面和漫反射都涵盖进去得了。

(2)金属度贴图(灰度)

这张图规定了物体是否是金属。1是金属,0是非金属。

(3)粗糙度贴图(灰度)

存储物体的表面粗糙度信息,1为非常粗糙,0为非常光滑。

这时候你可能产生了问题,诶,我们似乎只存储了“金属的镜面反射颜色”和“非金属的漫反射颜色”还有“表面粗糙度”,还有“金属的漫反射颜色”和“非金属的镜面反射颜色”去哪里了?

最早我们就提到过,金属几乎是没有漫反射的,所以我们完全不必储存这个信息,全当它是0就好了。同样,非金属的镜面反射也是非常微弱的、不同材质的差距也小,所以在“金属/粗糙度”流程里,程序直接将非金属的镜面反射率(F0)当成了0.04。

所以实际上,那张“金属度”贴图,就存储了“金属的漫反射 和 非金属的镜面反射”——程序通过非常简单的转换,将所有的金属漫反射都填上了0,并给非金属的镜面反射填上了0.04。


在 镜面反射/光泽度 流程中,我们同样使用三张贴图。

(1)漫反射贴图(Diffuse)(RGB)

这里储存漫反射颜色信息。前面提到过,金属几乎没有漫反射,所以在这张图里,金属部分要填成黑色;非金属部分应正常填充其漫反射颜色。

(2)镜面反射贴图(RGB)

这里储存镜面反射颜色信息。金属的镜面反射颜色不必多说,在这里值得一提的是非金属。前面提到过,非金属的镜面反射是非常非常微弱、并且实际上几乎没有颜色倾向的,所以在这里我们会将非金属的镜面反射信息填成非常相近的灰黑色

(3)光泽度贴图(灰度)

实际上就是表面粗糙度贴图的反转。1代表非常光滑,0代表非常粗糙。

镜面反射/光泽度流程实际上是更贴近原理的一套流程,它按照原理划分了漫反射和镜面反射,非常直接的提供了所有信息。


对比上面的两种流程,其实我们很容易发现,实际上它们就是把信息以不同的方式整合、存在不同形式的贴图里而已。

在金属/粗糙度流程里,最明显的优势就是它的贴图没有任何浪费,总共只使用了五个通道就解决了信息问题。但它的问题在于,为了节约通道,它默认了非金属的镜面反射率,这从一定程度上限制了我们的设计发挥。

在镜面反射/光泽度流程里,它敞开了所有数据供我们在贴图中调整,但这导致它不得不使用两张彩色图,造成了一定程度上的存储浪费(在两张彩色图中都有部分仅存储了灰度信息)。


五、一点废话

以上就是对PBR流程的简要分析概括,最大程度上避开了复杂的物理原理、同时也尽量说清了背后的规则。此篇主要是针对美术向了解PBR流程之用,更多详细原理还是要依赖更官方的大佬分析。


参考材料:

PBR_Guide_Vol1_中文版

PBR_Guide_Vol2_中文版

谢谢各位大佬,如有错漏,烦请指正


鲜花

握手

雷人

路过

鸡蛋

最新评论

QQ|手机版|小黑屋|九艺游戏动画论坛 ( 津ICP备2022000452号-1 )

GMT+8, 2024-3-29 01:39 , Processed in 0.039045 second(s), 18 queries .

Powered by Discuz! X3.4  © 2001-2017 Discuz Team.