编者按:
本文转载于公众号:
作者:
如需转载请与原公众号或原作者联系。
![](https://images.vraystation.com/news/how-to-use-the-pbr-process-in-film-and-television-rendering/01.jpg)
图片来源:神秘海域4 游戏截图,PBR 流程应用典范
在最近两年,游戏美术行业刮起了一股猛烈的 PBR 热潮,其热度之强不亚于当年的“次时代”。对于几乎重新定义了游戏美术的 PBR 流程来说,很多朋友有非常多的疑惑。比如说,为什么 PBR 的效果为什么看起来这么好;从事影视行业,是否需要学习和使用 PBR 流程;如果需要,那么我们又要怎么用?
本文将从影视从业者的角度,非常细致专业地地讨论这几个问题,让大家明白这一切的来龙去脉。(建议在理解能量守恒,菲尼尔反射,所有物体都具有反射[4],所有反射都是菲尼尔反射[5]的基础上阅读本文)
怎么用影视的逻辑理解 PBR?
PBR 是 Physically Based Rendering 的缩写,翻译过来是基于物理的渲染。然而这只是一个名字,只能说是一定程度上接近物理,离真正的物理还是有差距。不过 PBR 流程已经可以非常优秀地描述日常生活中我们遇到的大多数材质了。
对于从事影视工作的很多朋友来说,理解 PBR 材质的属性有一定的困难,因为使用的词汇跟我们用的材质球上的有些不一样。PBR 使用的属性主要是这四个——Diffuse、Roughness、Metallic、Normal(这里主要讨论的是最流行的 Metal-rough模型,而不是 Specular-glossiness模型或者其他),其中 Diffuse、Roughness、Normal 都和影视行业中使用一致,分别指代材质的 漫反射颜色、反射模糊粗糙程度、以及法线。
而,最难理解,也是差异的关键,就在这个 Metallic 属性上。
Metallic 翻译过来:金属度,按照一些文档的说法[1],这是个很简单的概念,就是指材质是否是金属。这个数值原则上只接受两个数值——或者 1。Metallic 为的时候,这个材质就不是金属,就是所谓的电介质材质(Dielectric);Metallic 为 1 的时候,那么这个材质就是金属材质。(除了金属以外的几乎一切材质都是电介质)
然而,这只是一种很感性的说法。对于已经有完备知识体系的渲染艺术家来说,这个参数是不可理喻的,几乎找不到任何既有的经验与之对应。用影视从业者可以听懂的语言跟大家说的话,实际上这个参数真正控制的东西是:F0,也就是菲尼尔反射中,与摄像机视线垂直的面的反射率。之所以要叫:F0,是因为摄像机视线与这个区域面法线的夹角为0度。
![](https://images.vraystation.com/news/how-to-use-the-pbr-process-in-film-and-television-rendering/02.jpg)
图片来源:Allegorithmic 官方帮助文档,VOLUME 1: THE THEORY OF PHYSICALLY BASED RENDERING [2]
当 Metallic 值为 0的时候,F0 的值是 0.04;而当 Metalness 值位 1 的时候,F0的值是 1;Metallic 是 0~1 的中间值的时候,F0 也会在 0.04 和 1 之间进行对应的插值,估计是线性差值。在这个过程中 F90 不变,永远恒定为 1(也就是图中圈出的边缘区域,标记为100%)。
F0 这个属性,说起来好像我们平时也没用过啊?实际上并不是,在 Arnold 渲染器的默认材质 aistandard 上,有一个叫做 Reflectance at Normal 的属性,从字面意思来说,是法线方向的反射率;这里所谓的法线方向,就是前文提到过的摄像机视线与面法线的夹角为 0 度时的法线方向;那么这个属性,实际上就是 F0 属性。
![](https://images.vraystation.com/news/how-to-use-the-pbr-process-in-film-and-television-rendering/03.jpg)
这样看的话,PBR 流程里输出的贴图,似乎和我们平时使用的渲染器,都可以一一对应上,那么,从道理上来讲,我们也可以使用 PBR 流程的贴图啦。
如何在我们熟知的渲染器中使用 PBR 贴图
使用的方法本身也并不很复杂。不过要分成两种情况来讨论。因为从事影视工作的朋友平时用的渲染器对于反射的处理方式有所不同,所以要使用不同的方案来对接。在这里,我就例举两个代表性的渲染器 Arnold 和 V-Ray。
1)在 Arnold 中使用 PBR 贴图
首先,我们要导出 PBR 的贴图供 Arnold 渲染器使用,在这里,我使用的贴图软件是 Substance Painter;由于它提供了多样而灵活的导出方案,可以加快工作流程,所以这里选择了它。
导出的时候,直接就有 Arnold 的贴图预制可供使用。
![](https://images.vraystation.com/news/how-to-use-the-pbr-process-in-film-and-television-rendering/04.jpg)
其中,Diffuse 贴图连接 Diffuse Color 通道,色彩空间为 sRGB。
Specular 贴图连接 Specular Color 通道,色彩空间为 sRGB。
Roughness 贴图连接 Specular Roughness 通道,色彩空间为 Linear。
F0 贴图连接 Reflectance at Normal 通道,色彩空间为 Linear。(这里要勾选fresnel选项)
![](https://images.vraystation.com/news/how-to-use-the-pbr-process-in-film-and-television-rendering/05.jpg)
Normal 贴图连接 Bump mapping 通道,色彩空间为 Linear。bump 2d node 设置为 tangent space normals。
在这个过程中 specular 的 weight 恒定为 1 。
别的贴图的使用本篇文章暂不讨论。
在贴图都连接并且设置正确,渲染器的色彩空间也设置正确的情况下,通过 Arnold渲染出来的结果,会和 substance painter 中截图的效果非常接近。
![](https://images.vraystation.com/news/how-to-use-the-pbr-process-in-film-and-television-rendering/06.jpg)
Substance Painter 中截图的效果
![](https://images.vraystation.com/news/how-to-use-the-pbr-process-in-film-and-television-rendering/07.jpg)
Arnold 渲染出的效果
当然,由于 Substance Painter 这种软件的渲染方式有很多近似计算方式,比如说反射效果是通过将环境球的图片模糊之后映射到模型上的方式来快速实现的,而并不是使用真实的光线追踪算法,所以最终的视觉效果会和渲染器渲染的有所出入。
不过,这种差异完全在接受范围之内。并且可以通过预览时使用 iray 这种 GPU 渲染器来弥补。
2)在 V-Ray 中使用 PBR 贴图
同样,首先从 Substance Painter 中使用 V-Ray 的预制,导出一套贴图。
![](https://images.vraystation.com/news/how-to-use-the-pbr-process-in-film-and-television-rendering/08.jpg)
大部分内容都差不多,只不过 reflection 取代了 specular,这两个贴图都是用来描述反射颜色的,名称不同,意义一致。
Glossiness 是 Roughness 的反义词,都是对反射模糊粗糙程度的描述,只不过一个指的是清晰的程度,一个指的是模糊的程度。
而最令人费解的贴图是一个叫做 ior 的玩意儿。第一次接触的朋友绝对会懵。IOR 这个词是 Index Of Refraction 的缩写,意思是折射率。按照初中物理知识来说,折射率这个东西是透明的玻璃之类的物体才会有的,应该是透明物体的固有属性了,怎么会变成一张贴图?这张贴图又能起到什么样的作用?
大家跟之前 Arnold 的输出贴图进行对比就会发现,这里的 ior 贴图对应的是 Arnold 输出的 F0。那么进行简单的猜测,是否这两种贴图有内在的联系呢?答案也是肯定的。
我们在 allegorithmic 出的帮助文档[2]上可以找到这样一个公式:
![](https://images.vraystation.com/news/how-to-use-the-pbr-process-in-film-and-television-rendering/09.jpg)
大家不要看到公式就害怕,至少这一个就很简单嘛。
这个公式描述的就是 F0 和 ior 之间的关系。等式左边的当然就是 F0 了,而右边的 n 则指代 ior。那么通过这个公式,我们可以粗略地感受到,F0 和 ior 是有一种内在的对应关系的。
现在我们来尝试做一个简单的运算,当 ior 等于 1.5 的时候,可以非常容易口算出,F0 是等于 0.04 的。咦,似乎这个 0.04 有点眼熟?这种既视感是怎么回事?
事实上,前文就已经出现过 0.04 这个数字了。“当 Metallic 值为 0 的时候,F0 的值是 0.04”。0.04 就是 PBR 流程里,给所有非金属物体的 F0 强制设置的值,与之对应的,ior 的值为 1.5。
根据影视渲染的知识体系,我们知道,ior 这个属性,也是可以用来描述反射强度的。一般我们会使用 1.3 到 1.6 之间的 ior 去设置非金属材质,20 以上的 ior 去设置金属材质。
这里插个小知识。认真看到这里的朋友可能会有个疑问,就是我们平时做渲染,ior 可能会给得比较多变,但是按照我前面说的内容,好像 PBR 里非金属的物质,恒定使用1.5的 ior 不改?那岂不是反射强度都是一样?这样做出来的材质能对吗?
大家可以再看看文章开篇神海4的场景,他们也是用的这套系统做的,并没有什么不妥。为什么恒定用 1.5 的 ior 不会有问题?因为自然界中所有的非金属物质 F0 的变化也无外乎在 0.02~0.05 之间变动[2],差异非常小,就算全都用 0.04,也看不出来太多变化。
而某些软件也考虑到这个问题,会在基本的 PBR 参数上增加一个参数来稍微控制一下 F0 的强度,让艺术家有更大的操作空间。比如虚幻4 游戏引擎的材质,就有一个 specular 属性,但是这个 specular 却和传统的 specular 完全不同。它实际上发挥的作用是让 F0 能够从 0.02 到 0.06 进行变化。大家可以点开本文后面的链接,虚幻4的帮助文档上有滑条可以拖动观察效果。[1]
![](https://images.vraystation.com/news/how-to-use-the-pbr-process-in-film-and-television-rendering/10.jpg)
将 PBR 的贴图连入 V-Ray 的材质,和 Arnold 的方法几乎一致,除了要将 ior 贴图连入材质的 ior 通道以外。
并且这里还有一点非常注意的事情是,这里我们一直在说的 ior 贴图,严格意义上说应该是 1/IOR 贴图。
![](https://images.vraystation.com/news/how-to-use-the-pbr-process-in-film-and-television-rendering/11.jpg)
大家可以看看输出的这张 1/ior 贴图,你可以想象一下,如果输出的是 ior 贴图,因为 ior 的值,非金属是 1.5,金属也要大于 20,都是大于 1 的值,体现在贴图上的话,肯定就是纯白的一片,不会是这样的灰度图。
![](https://images.vraystation.com/news/how-to-use-the-pbr-process-in-film-and-television-rendering/12.jpg)
那么我们是不是要在三维软件中,再对这个 1/ior 贴图进行一个反转,得到真正的 ior 数值以后,再插入 ior 通道呢?如果你使用的是 V-Ray 渲染器的话,就没有这个必要,因为 V-Ray 会自动识别插入ior通道的数值,小于 1 的话,就自动当做 1/ior 处理。
以上,就通过讲解在 Arnold 和 V-Ray 这两款渲染器中使用 PBR 贴图的方法来梳理了 F0 贴图和 ior 贴图的使用方法,其他各种渲染器也无外乎就是使用这两种方法之一。
有意思的一件事情是,Redshift 这款渲染器,因为借鉴了大量其他渲染器,所以,材质球上同时继承了 F0 和 ior 的接口。同时,在新版本的 rsMaterial 材质(即开源的 alsurface 材质升级版)当中,居然还做了 metalness 这个属性,可以直接像游戏引擎一样和 PBR 流程进行对接,也是蛮潮的。[3]
![](https://images.vraystation.com/news/how-to-use-the-pbr-process-in-film-and-television-rendering/13.jpg)
PBR 材质真实感的来源
很多朋友一直疑惑,为什么使用 PBR 流程以后,游戏的画面会有那么大的提升,甚至已经开始超越影视级别的效果。是不是影视里用的流程比不过 PBR 流程?
通过本文前面的阐述,大家会发现,PBR 流程里输出的贴图,我们在各种渲染器里也是照用,渲染出来的效果接近甚至更好。也就是说,游戏 PBR 流程出来的效果,用影视的制作方法是完全可以复刻甚至超越的,但是反过来不行。
PBR 流程只是对电介质和金属这两大类材质进行了很好的定义,但是对于透明材质3s 材质之类的,有很大缺失。
那么,为什么 PBR 流程还是给大众留下了好像比影视流程更真实的印象呢?
通过前文的叙述,大家是否发觉一件事情,PBR 流程对于反射参数的修改,就只有两个——F0 和 Roughness。看起来似乎非常局限,很扼杀艺术家的创作空间,相比之下,我们平时用的材质,对于反射有无限的修改权利,不光可以调 F0 的强度,还可以调 F90 的强度,还可以调整体强度,还可以调 F0 到 F90 的过渡曲线。
这使得我们的工作看起来更加的自由,更加具有创造性,而实际上,
正是软件给我们的自由过了火,才使我们犯了错。如果说我们的目的是为了创造真实,那么这种自由让我们背道而驰。在 PBR 流程里,连调节反射强度的机会都不给你,不管你怎么调节,永远无法打破能量守恒,无法消除菲涅尔反射,无法创造出自然界中不存在的材质。正是这种看似强硬的限制,反而提升了 PBR 流程的准确度,更符合绝大多数情况下的行业需求。
很多时候,并不是说现在游戏的美术人员水平更高,而是说他们犯错的机会几乎没有。而从事影视行业的渲染艺术家,想要做到同样的质量,却需要更高的学习成本。你只有理解到背后所有的这些知识,才会控制住自己不犯错,不会出现“那里有那么一个属性存在,所以我就要去调一下”的情况。
前面的文字更多的偏向于思路的梳理,对于老司机肯定一点就通。但是依然有很多朋友表示看完以后,还是没学会怎么操作,所以我又录制了一个视频,专门讲清楚到底是如何操作的。希望对你有帮助。
参考资料:
[1] Unreal Engine 4 官方帮助文档,Physically Based Materials
https://docs.unrealengine.com/latest/INT/Engine/Rendering/Materials/PhysicallyBased/
[2]allegorithmic 官方帮助文档,VOLUME 1: THE THEORY OF PHYSICALLY BASED RENDERING
https://www.allegorithmic.com/system/files/software/download/build/PBR_Guide_Vol.1.pdf
[3]redshift 官方帮助文档,rsMaterial
http://docs.redshift3d.com/#I/Material.html
[4]everything is shinny
http://filmicgames.com/archives/547
[5]everything has fresnel
http://filmicgames.com/archives/557