3D模型主要是通过材质(Material)和贴图(Texture)来表现其精美的外表,说白了就是一张“画皮”而已。我们之前的DirectX课程中介绍过材质,它实际就是对光的反射率,这样简单的设置并不能展现3D模型的外观,因此就引入了贴图来展示模型物体的表面纹理。请注意,贴图是材质的一部分,因为材质的本质就是颜色,图像是展示颜色的最好方式。但是,本章节要讲的是PBR材质。PBR全称Physically Based Rendering,译成中文是基于物理的渲染,是目前非常流行的一种拟真渲染技术。它是利用真实世界的原理和理论,通过各种数学方法推导或简化或模拟出一系列渲染方程,并依赖计算机硬件和图形API渲染出拟真画面的技术。
以上是电影《战斗天使》的画面。主角阿丽塔是计算机通过PBR技术渲染出来的虚拟角色。对于游戏而言,PBR材质已经成为了次时代游戏的标配。Unity从5.0开始就支持PBR材质了。Unity内部实现机制遵循了PBR的基本准则,支持金属度,表面粗糙度,能量守恒,菲涅尔反射,表面阴影遮蔽等特性。
接下来,我们仍然在“LightDemo”工程中创建一个新的场景SampleScene2.unity。材质也是一个资源,所以我们要在Project视图中右键选择“Create”->“Material”,然后重命名为“TestMaterial”即可,截图如下:
我们选中“TestMaterial”材质文件,然后查看它的Inspector检视面板,查看它的属性
在我们之前的很多章节中,我们已经简单使用过材质了。我们基本上都是设置一个颜色值而已。修改的方式就是点击“Albedo”后面的颜色框,非常的简单。接下来,我们就系统性的讲解一下材质的各个属性。
首先是Shader的分类:standard和standard(Specular setup)
两者区别是,standard使用了金属模拟的外观,而standard(specular setup)使用镜面模拟的外观。两者都支持PBR材质,只是对应的参数是不一样的。我们一般使用标准着色器standard就行了。什么是Shader?它与材质的关系是什么?在Unity中,材质与Shader的关系很紧密,Shader是材质的一部分,称之为着色器。着色器的本质就是一小段程序,它负责将网格模型和贴图或者颜色按照指定的算法进行渲染输出。简单的理解,Shader的作用是告诉GPU如何去绘制模型的每一个顶点的颜色以及最终每一个像素点的颜色。另外,Shader与渲染管线也有密切的关系。我们之前在DirectX课程中讲过渲染管线的一些内容,它是非常复杂的流程,包括坐标系转换,光照计算,光栅化等等。固定渲染管线已经帮我们实现了大部分的流程,我们能够做的大部分操作只是对模型的控制,但是如果想要实现逼真的现实世界的画面,我们就需要对渲染管线的内部流程进行定制,也就是我们所说的可编程渲染管线。在Unity中就是通用渲染管线 (URP)和高清渲染管线 (HDRP)两种。在这个渲染流程中,我们就可以使用Shader来实现基于物理的着色渲染(PBR)。可以说,Shader是可编程渲染管线中非常重要的一部分,也是实现AAA级游戏画面的关键部分。
接下来就是“Rendering Mode”渲染模式,它有如下几项可以选择:Opaque(不透明),Cutout(裁剪),Fade(渐变),Transparent(透明)四种,他们影响的是透明效果,解释如下:
1. Opaque此项为默认设置,适用于没有透明区域的普通固体对象,说白了就是不透明。
2. Cutout用于创建在不透明区域和透明区域之间具有硬边的透明效果(只有透明和不透明)。
3. Transparent适用于渲染逼真的透明材质(可以设置透明度),如玻璃效果。
4. Fade - 允许透明度值完全淡出对象,可对淡入或淡出的对象进行动画化。
我们以一张图片为例,来说明“Rendering Mode”渲染模式的区别。
首先,我们创建一个Plane,然后调整它的参数,如下
接下来,我们将之前的一张照片(sunwukong.bmp)放置到Assets目录下。
接下来,我们如何将图片添加材质中呢?很简单,只需要将图片拖动到Albedo”前面的矩形框内,不是后面的颜色框哦。如下所示
同时,在Project面板中材质文件也会发生变化,
接下来,我们如何将材质赋予Plane平面上面呢?直接拖动材质文件到Plane上或者其Inspector检视面板中即可。这样拖动的最终设置如下
平面Plane的Mesh Renderer组件用于渲染游戏对象,它的第一个属性就是Materials材质组。我们拖动的效果就是将我们的材质赋予了材质组的第一个材质元素。回到我们Scene场景中,就会发现Plane会显示我们的图片了。
可能是由于我们对平面Plane的旋转是不对的,因此我们重新调整一下。
我们Play运行工程,查看效果
这是“Rendering Mode”渲染模式默认Opaque的效果(不透明)。
这是Cutout裁剪的效果。
这是Fade渐变效果(与Cutout裁剪类似)。
这是Transparent透明效果。
接下来我们重点说一下PBR相关的参数:
Albedo:基础色,可使用一个颜色值,也可用使用纹理贴图。相当于我们之前的漫反射颜色。
Metallic:金属度,数值在0-1之间,也可以用金属贴图代替,此时Smoothness参数会消失。金属度影响的是高光反射,数值越高,金属感越强。金属度贴图本身是一张灰白图,越白的地方,金属度越强烈,越黑的地方金属度越低。
Smoothness:光滑度,数值在0-1之间,表示材质表面的粗糙程度,影响的是反射效果。
Smoothness Source:指定存储光滑度数据的纹理通道,可选择金属度贴图的Alpha通道或基础色贴图的Alpha通道。
请注意,金属度和光滑度影响的是物体表面的反射情况,图片可能无法看到这种效果。我们使用一个球体,并附加颜色值为(123,78,8,255)的橙黄色材质来查看这两个属性的作用效果。默认情况下,金属度Metallic为0,且光滑度Smoothness为0.5,效果如下
我们可以清晰的看到高光部分,接下来我们调整光滑度Smoothness为0(金属度也是0)
高光没有了,接下来我们调整金属度Metallic为0.5(光滑度是0)
颜色偏暗,接下来调整光滑度Smoothness为0.5(金属度也是0.5)
现在就非常像一个金属球了。
接下来介绍的是四个贴图:Normal Map,Height Map,Occlusion和Detail Mask
1. Normal Map:法线贴图;用于增加模型的表面细节;只是改变的表面上的光照结果,并没有真正改变表面上的形状。通过法线贴图使物体低模物体表面具有高度的细节效果。法线贴图本身是一张蓝色的凹凸图。它的原理就是将模型表面的法线向量(x, y, z)存储到一个 RGB 纹理贴图中。法线贴图一般都是通过高模烘焙得到的,并不是手绘的。
2. Height Map:高度图,法线贴图和高度贴图都是凹凸贴图(Bump Map)。它们都是用贴图,去展现低模的表面细节,但它们以不同的方式存储数据。高度图应为灰度图像,白色区域表示纹理的高区域,黑色表示低区域。与法线贴图对比,这种技术更复杂,性能也更高。高度图和法线贴图可以一起搭配使用。
3. Occlusion 称之为AO贴图,负责环境光和环境光反射产生的间接光照,主要用于改善阴影,给场景(模型)更多的深度,有助于更好的表现模型的细节。AO 贴图本身是一张灰白图。
4. Detail Mask 细节遮罩贴图,这个贴图是配合“Secondary Maps”中的 Detail Albedo,Normal Map 两张贴图配合使用的,可以屏蔽模型的某些区域的细节纹理。这意味着您可以在某些区域显示细节纹理,某些区域不显示。这里顺便说一下“Secondary Maps”,也就是细节贴图,主要在近距离观察时具有清晰的表面细节。
最后在介绍一个“Emission”,也就是让模型自发光,这个比较简单。
总结,我们发现基于PBR材质的渲染,能够达到非常逼真的效果。但是,它需要很多的贴图来支持,这就需要美工人员来进行制作。现代游戏的研发流程:美术用建模软件,建立高模模型,然后制作出法线贴图。然后把这个法线贴图,用于减面之后的低模模型上,这样就能用普通贴图,在低模上渲染出高模上的细节。在软件使用上,除了我们日常使用的3ds max和maya之外,推荐大家使用Substance 这款软件。Substance是Allegorithmic公司的一套PBR美术制作工具,包括Substance Painter和Substance Designer两款软件。其中,Substance Painter是PBR贴图绘制软件,该软件提供了大量的画笔与材质,可以让我们轻轻松松的导入自己的模型,然后绘制输出PBR贴图。2019年初,Adobe公司收购Substance Painter和Substance Designer的开发公司Allegorithmic。随后,Adobe就发布了Substance 3D 全家桶,全新发布的 Adobe Substance 3D 系列应用软件由 Substance 套件进化而来。例如,Substance 3D Stager是三维场景搭建软件,Substance 3D Painter是次世代游戏贴图绘制软件,Substance 3D Sampler是真实材质贴图制作软件,Substance 3D Designer是三维贴图材质制作软件。目前使用比较多的是Adobe Substance 3D 2022版本,对应是Substance Painter是7.4版本。