Unity学习——纹理、材质&着色器

时间:2024-03-12 09:49:21

Unity渲染使用的是材质(Materials)、着色器(Shaders)和纹理(Textures),它们有着紧密的联系。

  • 材质定义了表面是如何被渲染的,通过包含它使用的纹理的引用,颜色色调等等。材质可用的选项取决于它使用的着色器。
  • 着色器就是包含数学计算和算法的小脚本,它根据灯光输入和材质配置来计算每个渲染像素的颜色。
  • 纹理就是 bitmap图像。材质包含纹理的引用,因此材质的着色器可以使用纹理来计算一个 GameObject的表面颜色。

纹理

正常来说,一个物体的网格几何只是一个大致形状,而大多数细节都是由问题提供的。纹理就是应用在网格表面的标准 bitmap图像。你可以认为一张纹理图像就像是被印在一张橡胶纸上,然后在适当的位置被拉伸和固定在网格上。纹理的定位是由 3D建模软件完成的。

3D模型纹理

使用 Materials能将纹理应用于物体。Materials使用专门的图形程序 Shaders来在网格表面渲染纹理。Shaders能实现灯光和着色效果,以模拟闪亮或凹凸不平的表面。它们可以同时利用两个或多个纹理,
纹理应该是 32x32,64x64,128x128这种格式的。可以在项目的 Assets文件夹中简单地添加纹理,之后它们会出现在 Project视图中。
一旦纹理被导入,你就可以将它分配给 Material。Material能被应用于网格,粒子系统或 GUI纹理。使用 Import Settings,它就可以被转变为游戏中不同类型应用程序的 Cubemap或 Normalmap。

GUI

游戏的图形用户接口(graphic user interface, GUI)由不直接用于游戏场景的图形构成,但是这些图形能让用户做出选择并看到信息。比如说,分数显示和选项菜单是游戏GUI的典型例子。这些图形与用于详细描述网格表面的图形不同,但是它们仍然是由标准的Unity纹理处理。

粒子

网格是理想的,用于表示固态物体的;但是对于火焰,烟雾和魔法特效来说就不那么合适了。这类效果最好是由粒子系统来处理。一个粒子就是一个小型2D图形,代表流体或气体的一小部分。当许多这样的粒子被创建并开始运动时,它们就能随意地产生出完美的特效。比如说,你可以通过从一个中心点高速发射火焰纹理粒子来表演爆炸效果。也能通过从场景中的一条高线由上向下加速水粒子来模拟瀑布。
星粒子系统
星粒子系统

创建和使用材质

Assets ->Create->Material可以创建材质。新材质默认被分配给标准着色器,且所有 map属性都为空:

一旦材质被创建后,就可以将其应用于物体并在 Inspector中调整它的所有属性。将创建好的材质拖动到Project视图里的物体就可以将它们绑定起来了。

设置材质属性

你可以选择任何你需要的具有特殊材质的着色器。从 Inspector中的 Shader的下拉菜单那选择一个新 Shader就可以了。选择的 Shader会相应地改变属性。将材质应用给场景中的物体,你将能够实时地看到物体属性也在变化。
有两种方法能将纹理应用于属性。

  • 从 Project视图拖动到 Texture正方形那
  • 点击选择按钮,并从中选择一个。

内置着色器

除了标准着色器外,还有许多内置着色器用于特定用途:

  • FX:灯光和玻璃效果。
  • GUI 和 UI:用于用户界面图形。
  • Mobile:简化移动设备的高性能着色器。
  • Nature:用于树和地形。
  • Particles:粒子系统效果。
  • Skybox:用于渲染背景环境。
  • Sprites:用于2D sprite系统
  • Legacy:被标准着色器取代的众多旧着色器。

着色器技术细节

着色器实际上就是一个包含数学计算和算法的脚本,用于显示模型表面的像素。标准着色器执行复杂和真实的照明计算。其他着色器可能使用更简单的或不同的计算来显示不同的结果。任何给定的着色器中都有许多属性,这些属性的值由使用该着色器的材质给出。通过与 GamObjects关联的渲染组件使用材质,可以渲染每个 GameObject的网格。
几个不同的材质引用同一个纹理是可行的。这些材质可能也使用相同或不同的着色器,这取决于实际需求。
下面这个例子使用了三个材质,两个着色器和一个纹理。

在这个图像中有红车和蓝车。每个模型的bodywork使用各自的材质 "Red car material" 和 "Blue car material"。
这些 bodywork材质使用同一个定制化着色器 "Carbody Shader"。使用定制化着色器是因为这个着色器为车
子添加了额外的特性,比如说金属闪亮渲染,或自定义损伤遮掩特性。
每个车身材质都引用 "Car Texture",这个纹理 map包含bodywork的所有细节,且没有特定的油漆颜色。
Carbody Shader接受一个色调 (tint colour),这个色调为红车和蓝车设置不同的颜色,令这两辆车在只使用了一个纹理的情况下看起来不同。
车轮模型也使用独立的材质,不过这次每辆车的车轮共享同一个材质。车轮材质使用 Standard Shader,且再一次引用 Car Texture。
注意车子纹理包含了 bodywork和车轮的细节。这是一个纹理地图集 (texture atlas),表示纹理图片的不同部分被显示地映射到模型的不同部分。
即使 bodywork材质使用一个包含车轮图片的纹理,但是车轮也不会出现在body上,因为这部分纹理并没有映射到 bodywork几何上。
类似的,车轮材质也使用同一个包含bodywork细节的纹理。bodywork细节也不会出现在车轮上。
这种映射是通过外部 3d应用里的 3D artist完成的,被称为 "UV mapping"
更具体地,着色器(Shaders)定义了:

  • 渲染物体的方法。它包含代码和数学计算,这类计算可能包括光源角度,观察角度和任何其他相关的计算。着色器也能根据最终用户的图形硬件指定不同的方法。
  • 能在材质 Inspector中定制化的参数,比如说纹理映射,颜色和数值。
    材质(Material)定义了:
  • 使用哪个着色器渲染此材质。
  • 着色器参数的特定值。比如说使用的纹理映射,颜色和数值。