材质、着色器、纹理 - 创建和使用材质
创建和使用材质
通过主菜单 Assets->Create->Material 或项目视图的上下文菜单,可以创建一个新材质。
默认情况下,新建材质会分配标准着色器,并且所有属性都空着,就像这样:
一旦材质被创建,你就可以把它应用到一个对象,并且在 检视视图 中修改它的所有属性。想把材质应用到一个对象上,只需要把材质从 项目视图 拖动到 场景是图 或 层级视图 中的任意对象上。
设置材质属性
你可以为材质选择任意着色器。操作非常简单,在检视视图中展开 着色器 下单框,选择一个新着色器。所选择的着色器决定了可改变的有效属性。属性可以是颜色、滑动器、数值或向量。如果你已经把材质应用到了 场景视图 中的某个激活对象上,那么,改变属性会实时应用到该对象上。
把纹理应用到某个属性有两种方式:
- 从项目视图拖动纹理资源到检视视图的纹理插槽上。
- 点击 选择 按钮,从弹出的下拉列表中选择纹理资源。
内置着色器
除了 标准着色器,还是许多其他类型的内置着色器,用于不同的用途:
- FX:用于光照和玻璃效果。
- GUI 和 UI:用于用户图形界面。
- Mobile:用于移动设备的高性能着色器。
- Nature:用于树木和地形.
- Particles:用于粒子系统效果.
- Skybox:用于渲染位于所有几何图形之后的背景环境。
- Sprites:用于 2D 精灵系统。
- Toon:用于渲染卡通风格。
- Unlit:用于绕开所有光照和阴影的渲染。
- Legacy:大量老版本着色器的集合,已经被标准着色器取代。
着色器技术细节
着色器是一段包含了数学计算和算法的脚本,用于决定模型表层的外观。标准着色器会执行复杂而逼真的光照计算。其他着色器可能采用简化或不同的计算方式,从而现实不同的结果。任意一个着色器都带有一组可改变的属性。这些属性可能是数值、颜色或纹理,当你查看材质时,属性会显示在检视视图中。材质由绑定到游戏对象的 Renderer 组件所使用,用于渲染游戏对象的网格。
多个不同的材质可以引用同一个纹理。这些材质可以使用相同或不同的着色器,完全取决于需求。
下面是一套设置组合的示例,用到了 3 个材质、2 个着色器和 1 个纹理。
在上图中,有一辆红车和蓝车。两个模型的车身使用不同的材质,分别是红车材质和蓝车材质。
两个车身材质使用了同一个自定义着色器 — 车身着色器。之所以使用自定义着色器,是因为它可以为汽车提供额外的功能,例如渲染金属光斑,可能还会提供自定义的损伤变形功能。
两个车身材质都引用了汽车纹理,一张包含了车身所有细节的纹理图,但是其中没有指定绘制颜色。
车身着色器还可以接受一个色调,用于为红车和蓝车设置不同的色调,从而让两辆车拥有不同的外观,而我们实际上只使用了一张纹理。
车轮使用一个独立的材质,但是两辆车的车轮共享这个材质,因为两辆车的车轮并没有什么不同。车轮材质使用标准着色器,,并再次引用汽车纹理。
需要注意的是,汽车纹理同时包含了车身和轮胎的细节 — 称为纹理集,纹理贴图的不同部分可以明确地映射到模型的不同部位。
尽管车身材质引用了一个包含车轮图像的纹理,但是车轮不会显示在车身上,因为车轮部分没有被映射到车身结构。
同样的,车轮材质也使用了同一个材质,其中包含了车身细节。但是车身细节不会显示在车轮上,因为只有贴图的车轮细节被映射到了车轮结构。
映射关系由外部 3D 应用程序制作,称为 『UV 映射』。
更具体地说,一个着色器定义了:
- 渲染游戏对象的方法。包括代码和数学计算,数学计算包括光源角度、视角和其他所有相关的计算。着色器也可以基于终端用户的图形硬件采取不同的方式。
- 在材质检视视图中可以自定义参数,例如纹理映射、色彩和数值。
一个材质定义了:
- 使用哪种着色器来渲染材质。
- 该着色器参数的具体值 —— 例如使用哪个纹理映射、色彩值和数值。
自定义着色器由图形程序员编写。使用 ShaderLab 语言,非常简单。不过,要让一个着色器在各种各样的图形显卡上都正常运行,是一项复杂的工作,并且要求对显卡运行原理有相当全面的知识。
一些着色器直接内置在 Unity 中,更多的着色器在 标准资源 库中。