着色器和材质(Shader&Material)

目标

  • 了解常用着色器和材质的属性及其背后的概念;
  • 使用着色器和材质来表达 3D 表面的颜色、反射率、平滑度、透明度、表面变化和其他属性;
  • 使用Shader Graph创建自己的着色器,它允许您使用图形界面生成着色器脚本的代码。

1. 着色器(Shader)

1.1 网格

网格是游戏对象的 3D 骨架。 Unity 中的每个游戏对象都有一个网格。它是物体的几何元素。 着色器和材质告诉 Unity 如何将 3D 游戏对象的网格从 3D 场景渲染到屏幕上的 2D 图像。

显示着色器、材质和网格的关系的图表,其中网格突出显示。

仔细观察下图的苹果,网格是一系列由顶点(单数:vertex )定义的平面 2D多边形,顶点是 3D 空间中存储为 XYZ 坐标的点。
如果 3D 物体仅由 2D 多边形制成,它就会像钻石或其他宝石一样具有刻面。 3D 网格需要额外的信息才能使其在某些地方显得平滑或弯曲。
网格数据还包括 法线,它们是定义表面面向的方向的附加值。当所有法线都垂直于边缘时,形状就会显得平坦且多面,如上图所示。
着色器根据法线将网格渲染为弯曲的,而不实际更改网格。球体实际上是由许多平坦表面组成的网格,但其法线使表面显得光滑。
着色器的工作是考虑来自顶点和法线的所有数据以准确表示网格表面着色模型定义了材质的颜色如何根据表面方向、查看器方向和光照等因素而变化。着色模型的选择取决于应用程序的艺术取向和性能预算。

1.2 网格过滤器和渲染器组件

在unity中,上图苹果游戏对象中,查看AppleBody,在右侧 Inspector 窗口中看到 网格过滤器(Mesh Filter)和网格渲染器组件(Mesh Renderer)
  • 网格过滤器组件指向项目中的网格坐标数据。可以在此处替换网格,方法是选择对象选择器(圆形图标)并从项目中的任何其他对象(例如苹果、梨、柠檬等)中选取网格。
  • 网格渲染器组件指定网格渲染方式的位置,包含几个属性,其中最重要的一个是材料(Materials)

1.3 Unity内置着色器

着色器必须与项目的渲染管线兼容。如果新建了一个空项目,却导入了使用不同渲染管线旧项目,很大几率会造成兼容性错误,所有 3D 模型外观将成为紫色。

  • 通用渲染管线(URP)中的着色模型

通用渲染管线 (URP) 为着色器提供以下着色模型:

  • 基于物理着色 (Physically Based Shading)
  • 简单着色 (Simple Shading)
  • 烘焙光照着色 (Baked Lit Shading)
  • 无光照 (No lighting)

2.材质(Material)

材质是一种与着色器一起定义网格渲染方式的资源。一种材质可以应用于多种网格

2.1 网格渲染器中应用材质

在上图 Materials (材质) 的部分,其中包含一个标记为 Element 0 (元素0) 的项目,右侧输入名称框中显示材质的名称 AppleRed, 这个就是当前苹果使用的材质。如果要改变材质,选择材质名称右侧的对象选择器(圆形图标),将出现“选择材料”对话框窗口,可在窗口中选择其他材质。

2.2 材质检查器

在上图的下方显示了所选的AppleRed材质的属性

2.2.1 Shader 属性

着色器提供了在不同平台以及不同渲染情形下所需的着色器选项,在此选择的 URP(Universal Render Pipeline), URP 渲染管线下继续选择了 Lit

Universal Render Pipeline 中常用的着色器分类:

  • 2D > Sprite-Lit-Default :专为 2D 项目设计,此着色器仅适用于平面对象,并将任何 3D 对象渲染为 2D。作为光照着色器,它将根据场景中到达对象的光线进行渲染。
  • Particles > Lit、Simple Lit 和 Unlit:这些着色器用于视觉效果 (VFX)
  • Terrain > Lit:此着色器针对 Unity 中的 Terrain 工具进行了优化
  • Baked Lit 烘焙光照:此着色器会自动应用于光照贴图
  • 复杂光照 Complex Lit、光照 Lit 和简单光照 Simple Lit:这些都是通用的、基于物理的光照着色器的变体。
  • Lit光照着色器响应场景中的光线,而无光照着色器则不会。
  • Unlit:无光照着色器对于某些艺术效果或通过不使用光照更有效地运行的优化项目很有用

2.2.2 Universal Render Pipeline/Lit Surface Options

  • Workflow Mode 工作流模式

使用此下拉菜单选择适合自己的物体表面纹理的工作流程:

  • 金属模式 Metallic:反射光和入射光颜色相同
  • 高光模式 Specular: 可以随意设置反射光的颜色,可以跟入射光色彩不同

在 Surface Options 表面属性中,将 WorkFlow Mode 工作流模式设置为不同值,会影响到下面 Surface Inputs 表面输入值 中的属性布局:

1. Metallic 模式:

2. Specular 模式:

  •  Surface Type 表面类型

使用此下拉菜单将不透明或透明表面类型应用于材质。这决定了 URP 在哪个渲染过程中渲染材质。

  1. Opaque 不透明:不透明表面类型始终是完全可见的,无论它们背后是什么。URP 首先渲染不透明材质。
  2. Transparent 透明:透明表面类型受其背景影响,它们会根据您选择的透明表面类型而有所不同。URP 在不透明对象之后在单独的通道中渲染透明材质。如果您选择透明,则会出现混合模式下拉菜单 Blending Mode。

  • Blending Mode 混合模式

只有 Surface Type 选择 Transparent 后,才会出现此属性选项

使用此下拉菜单来确定 URP 如何通过将材质与背景像素混合来计算透明材质的每个像素的颜色。

  1. Alpha : 使用材质的 alpha 值来更改对象的透明度。0 是完全透明的。1 看起来完全不透明,但在透明渲染过程中仍会渲染材质。用于可见但也会随着时间的推移而消失的视觉效果非常有用,例如云。
  2. Premultiply 自左乘: 将与 Alpha 类似的效果应用于材质,但保留反射和高光,即使您的表面是透明的。这意味着只有反射光是可见的。例如,透明玻璃。
  3. additive 叠加: 在另一个表面的顶部为材质添加一个额外的层。这对全息图有好处。
  4. Multiply 乘法: 将材质的颜色与表面后面的颜色相乘。这会产生更暗的效果,就像你透过彩色玻璃看一样。
  • Render Face 渲染面

使用此下拉菜单来确定要渲染几何体的哪一侧。

  1. Front:渲染几何体的正面,并剔除背面。这是默认设置。
  2. Back :背面渲染几何体的正面并剔除正面。
  3. Both: 两者都使 URP 渲染几何体的两个面。这对两边都可见的小而扁平的物体(如树叶)很有用。
  • Alpha Clipping 透明度裁剪

使用它在不透明区域和透明区域之间创建具有硬边的透明效果。

例如,创建草叶。为实现此效果,URP 不会渲染低于指定 Threshold 的 alpha 值,当您启用 Alpha Clipping 时会出现该值。您可以通过移动滑块来设置阈值,该滑块接受从 0 到 1 的值。高于阈值的所有值都是完全不透明的,低于阈值的所有值都是不可见的。例如,阈值 0.1 意味着 URP 不会呈现低于 0.1 的 alpha 值。默认值为 0.5。

  •  Receive Shadows 接收阴影

勾选此框以使您的游戏对象能够被其他对象投射到其上。如果取消选中此框,则游戏对象上不会有阴影。

2.2.3 Universal Render Pipeline/Lit Surface Inputs

  

  • Base Map(基础贴图、基础映射、漫反射贴图):

在 Unity 的 URP/Lit Shader 中,使用 Base Map 来设定 漫反射率,即物体表面的颜色或贴图用纹理。

  • 纹理可以拖拽到左边方框,或使用圆点(对象选择器)从资源文件中选择;
  • 右侧是颜色选择器

  • Metallic / Specular Map 金属/高光 贴图

1. Metallic Map : 对应 Metallic 工作流模式
使用滑块控制表面的金属感。1 是全金属的,如银或铜,0 是全电介质,如塑料或木材。对于脏污或腐蚀的金属,您通常可以使用介于 0 和 1 之间的值。
左侧也可以分配金属感使用的贴图纹理

  

2. Specular Map:对应 Specular 工作流模式
您可以通过单击旁边的对象选择器为其分配纹理。这将打开资产浏览器,您可以在其中从项目中的纹理中进行选择。或者,您可以使用颜色选择器.

  

3. Smoothness 平滑度:
对于这两种工作流程,您都可以使用“平滑度”滑块来控制表面上高光的分布。0 给出一个宽阔、粗糙的高光。1 提供像玻璃一样的小而锐利的高光。介于两者之间的值会产生半光泽外观。例如,0.5 会产生类似塑料的光泽度。

4. Source : 使用 Source 下拉菜单选择着色器从何处采样平滑度贴图。

  • Metallic Alpha(来自金属贴图的 Alpha 通道)
  • Albedo Alpha(来自基本贴图的 Alpha 通道)。

默认值为金属 Alpha。如果所选源具有 Alpha 通道,则着色器对通道进行采样并将每个采样乘以平滑度。

  • Normal Map 法线贴图

法线贴图 (Normal Map) 是一种凹凸贴图 (Bump Map)。通过设置法线贴图,可以添加表面细节,如凹凸、划痕和凹槽。从而捕捉光线,就像由真实几何体表示一样。

法线贴图拾取环境中的环境光照。

  

设置旁边的浮点值是 法线贴图效果的乘数。低值会降低法线贴图的效果。高值会产生更强的效果。 好处是,使用 2D 资源模拟出 3D 表面细节效果,大幅度节省机器性能.

  • Height Map 高度贴图

URP 实现了视差映射技术,该技术使用高度贴图通过移动可见表面纹理的区域来实现表面级遮挡效果。

它类似于法线映射的概念,但是这种技术更复杂,因此性能也更昂贵。

高度贴图通常与法线贴图一起使用,通常它们用于想给表面定义一个很大的凹凸效果使用.

  

设置旁边的浮点值是高度图效果的乘数。低值会降低高度贴图的效果。高值会产生更强的效果。

这种效果,它可以产生一个非常令人信服的 3D 几何效果,表面的凹凸效果有些会相互遮挡住,看起来真的像是 3D 几何体,但真实的几何体没有任何修改,因为这仅仅是绘制一个表面的效果。

  • Occlusion Map 遮挡贴图

遮挡贴图用于模拟来自环境光和反射的阴影,这使得照明看起来更逼真,因为更少的光到达物体的角落和缝隙.

  

用于提升模型间接光影效果。间接光源可能来自 Ambient Lighting(环境光),因此模型中凹凸很明显的凹下去那部分,如裂缝或褶皱,实际上不会接收到太多的间接光。

  • Emssion 散发(光)

使表面看起来像是在发光。启用后, 会出现 Emission Map 和 Emission Color 设置。

  • Emission Map 发光贴图
  • Emission Color 发光颜色

属性设置:

Color : 指定发光的颜色和强度。单击 Color 框可打开 HDR Color 拾色器。在此处可以更改光照的颜色和发光的强度 (Intensity)。要指定材质的哪些区域发光,可以向该属性分配一个发光贴图。如果您执行此操作,Unity 会使用贴图的全色值来控制发光颜色和亮度。还可以使用 HDR 拾色器对贴图着色和改变发光强度。
Global Illumination : 指定此材质发出的光如何影响附近其他游戏对象的环境光照。有三个选项:
Realtime:Unity 将此材质的自发光添加到场景的 Realtime Global Illumination(实时全局光照)计算中。这意味着此自发光会影响附近游戏对象(包括正在移动的游戏对象)的光照。
Baked:Unity 将此材质的自发光烘焙到场景的静态全局光照中。此材质会影响附近静态游戏对象的光照,但不会影响动态游戏对象的光照。但是,光照探针仍然会影响动态游戏对象的光照。
None:此材质的自发光不会影响场景中的实时光照贴图、烘焙光照贴图或光照探针。此自发光不会照亮或影响其他游戏对象。材质本身具有发光颜色。

  • Tilling 平铺

根据 U 轴和 V 轴缩放纹理以适应网格的 2D 乘数值。这适用于地板和墙壁等表面。默认值为 1,表示不缩放。设置更高的值以使纹理在您的网格中重复。设置较低的值以拉伸纹理。

  • Offset 偏移量

将纹理定位在网格上的 2D 偏移。

2.2.4 Detail Inputs & Advance Options

Detail Inputs

  • Mask 蒙版:

Mask 是一个 Alpha 通道贴图,可将指定区域与 Base Map 和 Normal Map 微表面贴图隔离开来。
选择一个纹理,定义 Unity 将细节贴图覆盖在表面输入贴图上的区域。蒙版使用选定纹理的 Alpha 通道。平铺和偏移设置对蒙版没有影响。

  • Base Map 基础贴图:

可以添加详细的颜色,例如织物中的线。
用来添加在上面基本贴图或法线贴图中无法捕获的细节。
Unity 使用叠加模式将此贴图与 Surface Base Map 混合。

  • Normal Map 法线贴图:

选择包含法线矢量数据的纹理。用一个法线贴图添加表面细节,如凹凸、划痕和凹槽。

使用设置旁边的滑块更改地图效果的强度。默认值为 1。

Tilling 和 Offset 跟上面的功能相同

Advance Options

  • Specular Highlights 镜面高光:

启用此选项可让您的材质具有来自直接照明的镜面高光,例如 定向灯、点灯和聚光灯. 这意味着您的材质会反射来自这些光源的光芒。禁用它以忽略这些高光计算,因此您的着色器渲染速度更快。默认情况下,此功能已启用。

  • Environment Reflections 环境光反射:

使用最近的采样反射反射探头, 或者,如果您在灯光窗口照明探头. 如果禁用此选项,您将进行更少的着色器计算,但这也意味着您的表面没有反射。

  • Sorting Priority 排序优化:

使用此滑块确定材质的时间渲染顺序。URP 首先渲染具有较低值的材质。您可以使用它来减少设备上的过度绘制,方法是让管道首先在其他材质之前渲染材质,因此它不必渲染重叠区域两次。这与渲染队列 在内置的 Unity 渲染管道中。

  • Enable GPU instancing 启用 GPU 实例化:

尽可能在批处理中使用相同的几何图形和材质渲染 URP 网格。这使得渲染更快。如果网格具有不同的材质或硬件不支持 GPU 实例化,URP 无法使用批处理渲染网格。

3. 实践练习

下载初始项目: unity着色器

3.1 打开项目

1. 下载上述文件,解压缩在unity hub中设定的项目目录中。

2. 在Unity hub点击 “打开” 按键,在项目目录中找到解压缩文件目录。

3. 选择 unity 2022 版本打开项目,在打开的 Unity 编辑器界面,在 Project窗口, Assets > CreativeCore_Shaders > Scenes 窗口中选择 tutorialScene_Shaders

  

然后可以在 Hierarchy 窗口中选择 Apple (2) > AppleBody,在右侧Inspector窗口中查看该游戏对象的 Materials, 对照上述1.着色器 和 2. 材质 查看 其属性:

  

3.2 创建材质

3.2.1 创建颜色材质

1.  在场景视图中,选择一个苹果 (例如 Apple (2)),然后按Ctrl + D (Windows) 或Cmd + D (macOS) 将其复制。
2.  新苹果(Apple(3))将与原先的选择的苹果的位置建立,两个苹果重合在一起。选择该新苹果,移动其在工作台上的空白处。
3.  在“Project”窗口中,打开“Asssets” > “CreativeCore_Shaders ”> “Materials”文件夹,在此位置创建新材质。
4.  在“材Materials”文件夹中,右键单击并选择“Create” > “Material” 。

  
5.  将此材料命名为“AppleRed 2”。

6.使用“底图”属性  中的颜色选择器,选择在苹果上看起来不错的红色阴影。

  

7. 在 Hierarchy 窗口中,选择 Apple(3) > AppleBody, 在右侧 Inspector 窗口, Materials下的Element 0 右边的材质名称为AppleRed,点击最右侧选择按钮,在弹出窗口中 输入AppleRed 2选择该材质,应用在新的apple上,如图所示:

  

3.2.2 创建固体材质

1. 选择场景中的 “梨” 的游戏对象,在Hierarchy窗口中选择 Pear(1) > PearBody, 可以看到该梨的材质是 “PlainGray”

2. 重复上述3.2.1 创建颜色材质 中步骤 3 和 4,创建一个新材质,取名 “SolidMaterial”, 然后选择该新材质,在Inspector中,Workflow Mode选择 Specular,在Specular Map 选择一个浅色,例如白色,再将Smoothness 设置成 1,如图所示

3. 在Hierarchy 窗口中单击选择 Pear(1) > PearBody, 鼠标左键选择上述新建 SolidMaterial,将该材质拖拽到右侧 Inspector 中 Materials 下面 Element 0 右侧的材质名称窗口,替换原先的 PlainGray,如图所示,应用该新材质后梨的材质将改变!

4. 重复上述3.2.1 创建颜色材质 中步骤 3 和 4,创建一个新材质,取名 “SolidMaterial 2”, 然后选择该新材质,在Inspector中,Workflow Mode选择 Metallic,在Base Map 点击颜色框,在弹出框的最下端 Hexadecimal 右侧输入ECCC15,例如白色,再将Smoothness 设置成 1,如图所示

5. 在Hierarchy窗口选择 Apple > AppleBody, 鼠标左键选择上述新建 SolidMaterial2,将该材质拖拽到右侧 Inspector 中 Materials 下面 Element 0 右侧的材质名称窗口,替换原先的 PlainGray,如图所示,应用该新材质后 苹果 的材质将改变!

6. 点击unity 界面正中间上方 play(三角形)按键,在 下方Game窗口移动摄像头对准上述选择的苹果,然后在最右侧Inspector下方的 Metallic Map 和 Smoothness 的移动滑竿设置不同的值,可以实时在左侧Scene 和 Game 窗口中看到该苹果材质的变化!

3.3 纹理材质​​​​​​​

纹理,就是位图文件。Unity 支持的纹理格式有: BMP、EXR、GIF、HDR、IFF、PICT、TGA、PSD、PICT、TIFF、PNG 和 JPG。

3.3.1 关于纹理

  • 在 Base Map 上使用纹理改变物体表面颜色

Base Map Texture (也称为漫反射或反照率)是一个常规 RGB 或 RGBA 彩色图像文件,用于定义对象表面的漫反射(即颜色)。

使用时,将纹理资源文件,拖拽或选择到 Base Map 属性左侧方框中即可。

可以使用到 Base Map 上的纹理资源文件,通常命名时,名称中会包含诸如 albedo、diffuse 或 base 之类的词,作为前缀或后缀

  • 平铺纹理

一些纹理可以用来像瓦片一样,在物体表面进行平铺(多次重复自身)贴图。注意:平铺和偏移设置适用于网格上的所有贴图。

平铺是网格表面上每单位的平铺数量。数字越大,图案越小。
偏移提供偏移量。例如,0.5 的 X 偏移将平铺偏移纹理宽度的一半。

  • UV 贴图

由 Autodesk® 3ds Max® 和 Maya® 或 Blender® 等建模应用程序制作的网格会生成它们自己的称为 UV 坐标的 2D 坐标集。UV 坐标类似于常规 2D 空间中的 XY 坐标,但它们被称为 UV 以将它们与环境坐标系 (XYZ) 区分开来。UV 坐标相对于网格,而不是场景中的 3D 空间。

UV 映射是展开 3D 模型的表面以创建平面,然后对其应用 2D 纹理贴图的过程。在此过程中,建模应用程序生成 UV 坐标,允许将纹理回绕到模型上。

建模可以产生复杂的对象,在上述Unity 项目中有一个角色Ellen (艾伦)。Ellen 由多个网格组成,称为子网格,每个网格都有自己的材质。但是 Ellen 只有几个子网格——从颈部以下的所有东西都是一个子网格,需要一种材料。

  •  用纹理改变反射特性

可以将贴图用于镜面反射/金属反射率和平滑度,以在网格上创建比其他区域更亮或更平滑的特定区域。

上述 Ellen 的身体材质使用的是 Metallic 工作流程,所以这张贴图是灰度的。虽然金属数据在纹理文件的 R、G 和 B 通道中,但着色器只读取 R 通道。

平滑度贴图(在我们的展示中显示为第三个纹理)存储在纹理文件的 Alpha 通道中。在Ellen 身体模型上许多不同类型的表面的各种平滑度。

3.3.2 使用纹理

本节将给场景中的水壶贴上纹理:

1. 依步骤 3.1 打开项目,在场景中选择水壶(kettle), 在中间 Hierarchy 窗口中 Kettle 将高亮显示,再在 Project 窗口中 点击 Assets > CreativeCore_Shader > Textures > Kettle 打开水壶纹理图案,如下图所示:

2. 右键点击 Assets > CreativeCore_Shader > Materials,在弹出菜单中选择 Create > Folder, 创建一个新文件夹,改名字为 “Kettle”。

3. 在上 Kettle 中,点击右键 Create > Materials, 将新的 material 取名为 Material_Kettle

4. 点击 Assets > CreativeCore_Shader > Textures > Kettle, 将该目录下的纹理图案拖拽到上个步骤中新建的 Material_Kettle中,

5. 将该  Material_Kettle 应用到场景中的 Kettle 水壶上。

3.3.3 半透明和透明效果

使用透明度创建一个看起来像玻璃的半透明对象,并使用 Alpha 剪切技术从简单的矩形网格创建逼真的叶子。

1. 在上述场景中,选择 Hierarchy > PlantInJar, 场景中灰白的瓶子将高亮,该瓶子中放着一个植物,如下图所示:

2. 在Project窗口中,打开 Assets > Creativecore_Shaders > Materials 窗口,点击鼠标右键在弹出菜单中 Create > Material,新建一个材质,命名为GlassJar,并将该 GallsJar材质应用于上述选择的 PlantInJar 下的 Vase 游戏对象,如图所示:

3. 在 Materials 窗口中点击新建的 GlassJar 材质,在右侧的 Inspector窗口中, 选择 Surface Type的属性从 Opaque 到 Transparent, Render face 属性为 Both, 再点击 Base Map 右边的颜色框,在弹出的 Color 菜单中,将 A 值改小 (小于256,例如100),这时可以看到玻璃瓶呈现透明效果,可以同时更改瓶子颜色(例如 浅绿色),增强透明效果!

4. 再移动 Metallic Map 和 Smoothness 右边的移动滑杆,可以更改镜面反射效果,更能体现玻璃表面特性。

5. 在Project窗口中,打开 Assets > Creativecore_Shaders > Materials 窗口,点击鼠标右键在弹出菜单中 Create > Material,新建一个材质,命名为 Leaf,并将该 Leaf材质应用于上述瓶子中植物的叶子 Leaf1 ~ Leaf9 游戏对象,如图所示:

6.  在 Assets > CreativeCore_Shaders > Texture > Plant, 将Plant_Albedo 纹理图像拖拽到 Leaf 材质中 Base Map 左边的窗口,然后在将 Render Face 改为 Both,如下图所示,可以看到植物变为绿色了!

7.  选择 Leaf 材质并在 Inspector 窗口顶部的Surface Options部分,然后启用Alpha Clipping,同时更改下面 Threshold 滑块阈值,仔细检查叶子时,移动此滑块。在某个阈值下,叶子周围的“纸”将会消失, 使叶子的边缘看起来正确。 

3.3.4  凹凸贴图效果

1.  在Project窗口中,打开 Assets > Creativecore_Shaders > Materials 窗口,点击鼠标右键在弹出菜单中 Create > Material,新建一个材质,命名为Pavement

2. 在Project窗口中,打开 Assets > Creativecore_Shaders > Textures > Tiled Textures,将该窗口中带有 Pavement 的纹理文件拖拽到上述新建的 Pavement 材质,height,normal, metallic,需相对应,如图所示:

4. 在工作台上选择一个游戏对象,例如 Capsule,将上述新建的 Pavement 材质应用到该 Capsule,可以看到该游戏对象表面有该材料显示,有一定的凸凹效果,如图所示:

5. 更改右下角的 Height Map右边的滑块值,可以看到表面凸凹效果的更改!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值