视频教程地址:http://v.youku.com/v_show/id_XMTc0NTY4MzgwMA==.html
SP2M脚本下载地址:http://pan.baidu.com/s/1c2dvene
SP2M脚本使用方法:http://v.youku.com/v_show/id_XMTc0OTQ2MDk3Ng==.html
在最近两年,游戏美术行业刮起了一股猛烈的PBR热潮,其热度之强不亚于当年的“次时代”。对于几乎重新定义了游戏美术的PBR流程来说,很多朋友有非常多的疑惑。比如说,为什么PBR的效果为什么看起来这么好;从事影视行业,是否需要学习和使用PBR流程;如果需要,那么我们又要怎么用?
图片来源:神秘海域4游戏截图,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度。
图片来源: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属性。
这样看的话,PBR流程里输出的贴图,似乎和我们平时使用的渲染器,都可以一一对应上,那么,从道理上来讲,我们也可以使用PBR流程的贴图啦。
二、如何在我们熟知的渲染器中使用PBR贴图?
使用的方法本身也并不很复杂,不过要分成两种情况来讨论。因为从事影视工作的朋友平时用的渲染器对于反射的处理方式有所不同,所以要使用不同的方案来对接。在这里,我就例举两个代表性的渲染器Arnold和VRay。
(1)在Arnold中使用PBR贴图
首先,我们要导出PBR的贴图供Arnold渲染器使用,在这里,我使用的贴图软件是Substance Painter;由于它提供了多样而灵活的导出方案,可以加快工作流程,所以这里选择了它。
导出的时候,直接就有Arnold的贴图预制可供使用。
其中,Diffuse贴图连接Diffuse Color通道,色彩空间为sRGB。
Specular贴图连接Specular Color通道,色彩空间为sRGB。
Roughness贴图连接Specular Roughness通道,色彩空间为linear。
F0贴图连接Reflectance at Normal通道,色彩空间为linear。(这里要勾选fresnel选项)
Normal贴图连接Bump Mapping通道,色彩空间为linear。Bump 2d Node设置为Tangent Space Normals。
在这个过程中Specular的Weight恒定为1。
别的贴图的使用本篇文章暂不讨论。
在贴图都连接并且设置正确,渲染器的色彩空间也设置正确的情况下,通过Arnold渲染出来的结果,会和Substance Painter中截图的效果非常接近。
Substance Painter中截图的效果
Arnold渲染出的效果
当然,由于Substance Painter这种软件的渲染方式有很多近似计算方式,比如说反射效果是通过将环境球的图片模糊之后映射到模型上的方式来快速实现的,而并不是使用真实的光线追踪算法,所以最终的视觉效果会和渲染器渲染的有所出入。
不过,这种差异完全在接受范围之内。并且可以通过预览时使用Iray这种GPU渲染器来弥补。
(2)在VRay中使用PBR贴图
同样,首先从Substance Painter中使用VRay的预制,导出一套贴图。
大部分内容都差不多,只不过Reflection取代了Specular,这两个贴图都是用来描述反射颜色的,名称不同,意义一致。
Glossiness是Roughness的反义词,都是对反射模糊粗糙程度的描述,只不过一个指的是清晰的程度,一个指的是模糊的程度。
而最令人费解的贴图是一个叫做ior的玩意儿。第一次接触的朋友绝对会懵。Ior这个词是index of refraction的缩写,意思是折射率。按照初中物理知识来说,折射率这个东西是透明的玻璃之类的物体才会有的,应该是透明物体的固有属性了,怎么会变成一张贴图?这张贴图又能起到什么样的作用?
大家跟之前Arnold的输出贴图进行对比就会发现,这里的Ior贴图对应的是Arnold输出的F0。那么进行简单的猜测,是否这两种贴图有内在的联系呢?答案也是肯定的。
我们在Allegorithmic出的帮助文档[2]上可以找到这样一个公式:
大家不要看到公式就害怕,至少这一个就很简单嘛。
这个公式描述的就是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]
将PBR的贴图连入VRay的材质,和Arnold的方法几乎一致,除了要将ior贴图连入材质的ior通道以外。
并且这里还有一点非常注意的事情是,这里我们一直在说的ior贴图,严格意义上说应该是1/ior贴图。
大家可以看看输出的这张1/ior贴图,你可以想象一下,如果输出的是ior贴图,因为ior的值,非金属是1.5,金属也要大于20,都是大于1的值,体现在贴图上的话,肯定就是纯白的一片,不会是这样的灰度图。
那么我们是不是要在三维软件中,再对这个1/ior贴图进行一个反转,得到真正的ior数值以后,再插入ior通道呢?如果你使用的是VRay渲染器的话,就没有这个必要,因为VRay会自动识别插入ior通道的数值,小于1的话,就自动当做1/ior处理。
以上,就通过讲解在Arnold和VRay这两款渲染器中使用PBR贴图的方法来梳理了F0贴图和ior贴图的使用方法,其他各种渲染器也无外乎就是使用这两种方法之一。
有意思的一件事情是,Redshift这款渲染器,因为借鉴了大量其他渲染器,所以,材质球上同时继承了F0和ior的接口。同时,在新版本的RsMaterial材质(即开源的Alsurface材质升级版)当中,居然还做了Metalness这个属性,可以直接像游戏引擎一样和PBR流程进行对接,也是蛮潮的。[3]
三、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
(注:本教程为火星网特约作者教程,版权归原作者所有,如需转载,请联系原作者,谢谢!)