第二十三章 Unity 材质

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版本。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
代码在文件 Properties { _Color ("Main Color", Color) = (1,1,1,1) _MainTex ("Diffuse (RGB) Alpha (A)", 2D) = "white" {} _SpecularTex ("Specular (R) Gloss (G) Anisotropic Mask (B)", 2D) = "gray" {} _BumpMap ("Normal (Normal)", 2D) = "bump" {} _AnisoTex ("Anisotropic Direction (RGB)", 2D) = "bump" {} _AnisoOffset ("Anisotropic Highlight Offset", Range(-1,1)) = -0.2 _Cutoff ("Alpha Cut-Off Threshold", Range(0,1)) = 0.5 } SubShader{ Tags { "RenderType" = "Opaque" } CGPROGRAM struct SurfaceOutputAniso { fixed3 Albedo; fixed3 Normal; fixed4 AnisoDir; fixed3 Emission; half Specular; fixed Gloss; fixed Alpha; }; float _AnisoOffset, _Cutoff; inline fixed4 LightingAniso (SurfaceOutputAniso s, fixed3 lightDir, fixed3 viewDir, fixed atten) { fixed3 h = normalize(normalize(lightDir) + normalize(viewDir)); float NdotL = saturate(dot(s.Normal, lightDir)); fixed HdotA = dot(normalize(s.Normal + s.AnisoDir.rgb), h); float aniso = max(0, sin(radians((HdotA + _AnisoOffset) * 180))); float spec = saturate(dot(s.Normal, h)); spec = saturate(pow(lerp(spec, aniso, s.AnisoDir.a), s.Gloss * 128) * s.Specular); fixed4 c; c.rgb = ((s.Albedo * _LightColor0.rgb * NdotL) + (_LightColor0.rgb * spec)) * (atten * 2); c.a = 1; clip(s.Alpha - _Cutoff); return c; } #pragma surface surf Aniso #pragma target 3.0 struct Input { float2 uv_MainTex; float2 uv_AnisoTex; }; sampler2D _MainTex, _SpecularTex, _BumpMap, _AnisoTex; void surf (Input IN, inout SurfaceOutputAniso o) { fixed4 albedo = tex2D(_MainTex, IN.uv_MainTex); o.Albedo = albedo.rgb; o.Alpha = albedo.a; o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_MainTex)); fixed3 spec = tex2D(_SpecularTex, IN.uv_MainTex).rgb; o.Specular = spec.r; o.Gloss = spec.g; o.AnisoDir = fixed4(tex2D(_AnisoTex, IN.uv_AnisoTex).rgb, spec.b); } ENDCG } FallBack "Transparent/Cutout/VertexLit" }[/code]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咆哮的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值