PBR:应用于虚幻引擎4贴图和材质创建的启示
PBR材质似乎在一夜之间改变了人们对于引擎实时渲染画面的理解。在游戏中我们也能够体验到锈蚀的金属,厚重的皮革,精细的纹理,更加真实的世界从此展现在眼前。自此,PBR材质成为了“次时代”游戏必备的标准。
在GDCC2015,来自Epic Games资深开发者支持美术设计师李文磊,为大家带来应用于虚幻引擎4贴图和材质创建的启示。
以下内容是演讲实录:
PBR是个不老不新的话题,很早它就出现在预渲染的渲染器里,随着硬件越来越快,尤其是显卡,最近几年逐渐的开始应用到实时渲染中来。
今天就和大家一起来聊聊虚幻引擎实时渲染引入PBR以后,我们怎么来正确的使用它
PBR即基于物理的渲染,渲染包括灯光,shader, 材质, 贴图,以及他们之前如何交互影响的,今天的演讲内容主要分三部分内容。1.真实世界的光,材质,以及他们之间的交互是如何的,2. ue4里是如何来模拟真实世界的,3.我们该怎么做才是正确的。
要学会使用PBR首先需要了解什么是PBR,需要从真实世界的这些PBR材质特有的属性拆分开来去了解他们,这样我们就需要了解光,物体表面材质以及光是如何与材质交互的。 光包括了颜色,亮度,衰减,强度,形状等主要属性,真实的世界中永远是多光源并存,除非身处于宇宙深空之中。
我们把自身能发光的物体叫做直接光源,自身不发光仅仅反弹其他光源的物体叫做非直射光源。分析下这张图,从美术角度我们把他分成主光,辅光,装饰光。虽然天色已晚主光还是来自于天空,天空的光线来自于太阳的散射,因此主光来自于一个天空的非直射光
附光来自于路灯,大的城市照明。这些光大都数也是反弹光,而非灯泡光源直接照射到。因此前景的人物基本是在一个天光的环境下低对比低照度的灯光环境下
那么自然界中的材质是如何跟光交互的呢?灯光照射到物体表面后两种情况,反射或继续前行折射。折射后的光线被吸收(一般转化为热),或离散。光线被吸收的行为不是发生在表面,而是次表面,或者内部反射不会带出任何颜色。
吸收会使光线强度降低,吸收某一光谱的光线,余下的光线颜色化,但方向不变,离散后方向改变,强度不变这里对于绝缘体和导体,两者与光的交互是完全不同的绝缘体,即非金属的反射率普遍很低,一般在2%-8%左右,大部分光线进行折射,折射后的光线或者被吸收,或者重新离散出来。这部分折射的光线吸收率和材质的明度关,暗的吸收多,亮的吸收少;离散后光线的颜色也取决于物体表面颜色;
对于导体,即金属,反射率普遍很高,达到70%-100%,所以大部分光线会以镜面反射的形式反弹回来。小部分光线折射后完全被吸收(光是一种粒子,被导体吸收),不同的金属吸收不同波长的光线,导致镜面反射回的光线带有颜色;
漫射和镜面反射:漫射为反射光线方向随机,不一致;镜面反射为一个方向。镜面反射会根据物体表面的粗糙程度表现不同结果。但无论光滑粗糙,反射的总能量是一样的,而且光线反射后的强度不变。漫射是光线被折射的表现。光线从一种媒介进入另一种媒介,并在里面经过多次的散射后从近似入射点的位置返回原来的介质中。漫射过程中除了光线的离散光线还会被吸收(转化成热能)。光线进入介质不深,那么进入点和离开点的差别就可以被忽略。那种光线离散性高,但吸收性弱的材质有时指参与介质或者叫透明材质。比如烟,牛奶,皮肤,翡翠,大理石等。
而在更细微的层面,比如显微镜下,微表面就是物体表面细微的不规则。根据不同的流程可以叫粗糙度,光滑度,光泽度。表面的不规则度其实对于慢反射的影响视觉上不大,因为漫射的这种离散和吸收过程是发生在材质内部的而非表面。
微表面理论就是建立在物体表面这种细微不规则性的基础上的。可以把它看作许许多多不同方向的面,这些面就叫做微表面。光线对于这些面对入射角都是不一样的,反弹后的角度也不一样,并且有的地方被挡住,有的地方会产生阴影,视觉上会产生模糊的反射
在引擎中的明暗shading计算引入了各种函数理论模型,来尽量逼近模拟自然界的物理现象
我们可以通过BRDF来了解UE4里面是如何模拟的。
BRDF 双向反射分布函数(Bidirectional Reflectance Distribution Function,BRDF)场景中的光照射到材质表面反射到视点的光亮度计算方法函数,来定义材质属性。它描述了入射光线经过某个表面反射后如何在各个出射方向上分布,这可以是从理想镜面反射到漫反射
UE4 PBS中引入了各种BRDF理论模型,也可以在shader里选择默认模型,最终需要效率和效果的一个最佳结合点。
通过一些简单的参数,我们可以在引擎中用来区分不同类型材质的反射特性。
在UE4材质里面,每一个input都有着各自的特性,他们的组合成为了一个个不同属性的物理材质。
通过一个简单的Metallic参数的调整,我们就可以轻易区分两个完全不同的材质。
物体表面的反光属性也是这样一个非常重要的参数,通过这张图片,我们就能够非常清晰的区分开来。
那么如何制作一个高质量的PBR材质,如何选择使用的工具,如何设置灯光呢?、
首先观察生活中的真实物体是非常重要的环节,它能够给你一个基本的概念,不同的材质应该有哪些不同的属性。在设计过程中,我们会有一些描述性的词语来清晰说明目标材质的属性(文字+图片),描述词汇包括
材质类型:钢,塑料,铁,玻璃,油漆
材质明度颜色
材质表面处理:打磨过的,抛光,磨砂
材质环境影响细节描述: 生锈的,刮擦的,磕碰的,脏的,油腻的,油漆剥落的,积灰的,崭新的
翻译这些信息到UE的材质属性,材质类型的信息来区分金属还是非金属,材质明度及颜色来定义BaseColor,表面处理关系到Roughness,环境影响复杂多变,牵扯到包括以上多个通道。
比如脏旧磕碰的金属掉漆的表面:掉落油漆的部分为金属,未掉落部分为油漆,在材质类型金属性的定义里区分开来;磕碰信息从法线贴图,粗糙度贴图;新旧又影响镜面反射的量和连续性,又和粗糙度贴图有关
在项目开始前问几个问题:
材质需要共用吗?
材质的精度要求高吗?
材质需要统一管理迅速迭代吗?
需要自定义或允许改变外观吗?
效率/内存:材质能够多复杂?贴图能够支持多少?
是否需要复用?
CG or Game?
需要改变贴图吗?
内存多大?
客户端大小?
编辑器内还是外
其他问题
通过创建区分材质,将一个模型不同的区域区分开来,区分大块面材质的意义在于一个物件有多种材质,必须有区分它们的mask,方便随时修改不同材质区域的贴图,提供在引擎中更换不同区域的材质的可能性,为进一步在表面增加细节提供区分的通道
区分材质的信息是灰度图,不同的区域可以放在一张RGBA贴图的各个通道里;根据材质的数量可以是单张或多张。
真实的世界中,每一个材质都有许多的细节,所以接下来,为材质添加更多的细节,比如划痕,污渍,环境元素等,这些信息来自于模型起伏,法线,可以手动选取;经常由一些工具软件生成,这些工具软件可以比较只能的根据已有的模型信息判断和生成出自然的细节。
将大块面的材质区分通道和细节材质区分通道进行混合,由于大块面材质区分通道和细节材质区分通道是分离的给混合提供了更多的自由度,这种自由度表现在可以控制哪些细节可以出现或者被屏蔽在哪些区域。
现在在市面上可以看到大量的工具可以帮助在UE4里面完成PBR材质的制作,在这里我们列举出了一些主流的配套工具。
制作的过程分为三个部分,从高模和低模创建出NormalMap,ID Mask ,AO和Cavity。然后再上面添加必要的细节,最终导入UE4。
在这里我们可以通过这些工具来增加细节贴图,在引擎中合并,这样可以让材质更为真实。
通过以下这些步骤,我们就能够表现多层材质
导入:主MASK, 细节MASK, NORMALMAP, AO, CAVITY
创建基本材质,包括基本材质中细节添加的可能性
创建母材质,混合基本材质
添加更多变化:图案,潮湿度/多孔性
创建材质实例
材质贴图都完事了?还没结束呢。PBR的关键之一灯光:创建真实的灯光环境。 (这里不谈论艺术的灯光环境,仅追求真实)
真实的灯光包括直射光,非直射光, 并且HDR,在灯光半径范围内的物体表面会被灯光直接照亮,并有高光点;范围外物任何照明(包括漫射和镜面反射)。
在真实世界中灯光理论上是没有范围的,虽然随着距离增加照度降低,但始终会有影响,在镜面反射上尤为明显。
这种反射在UE4里需要由高动态的环境反射贴图来表现,是一种IBL的照明方式。
有了灯光的烘托,一把次时代PBR材质的武器就正式登场了。
PBR材质是未来的标准,在传统材质转换到PBR材质的过程当中,我们会遇到很多的挑战。对于传统贴图到PBR贴图没有一键转换的工具,因为有些信息计算机是无法猜测出来的,还是需要主观去判断。目前有两种PBR流程贴图转换可以使用工具。
现在的灯光有直射光,阴影,也有间接光,间接反射等,所以贴图上不需要把灯光信息画上去,只要专注于表达材质属性。我们不需要画高光颜色(反色)来达到一个看上去是白色的;线性空间渲染意味着对于basecolor的明度范围大概30-50 到180-250
能量守恒使得高光如何怎么变都不会增加或减少,就不需要手动的来调整贴图使得粗糙的地方高光贴图暗,光滑的地方高光贴图亮。这时候就需要用已有的信息或修改后生成roughness,Cavity:来定义微表面的变化。
通过这样的调整,我们就能够将传统的材质转化到PBR材质。为我们的游戏添加更好的质感。