第3章
模型、材质和纹理
在本章中,你将学习关于模型的知识以及如何在 Unity 中使用它们。首先你需要了解网格和3D对象的基本原理。接下来,学习如何导入自己的模型或者使用从Asset Store中 获得的模型。最后我们将探讨Unity的材质和着色器功能。
3.1 模型的基础知识
如果没有图形组件,视频游戏肯定不会有那么好的效果。在2D游戏中,图形由称为精灵(Sprite)的平面图像组成。你只需改变这些精灵的X坐标和Y坐标的位置并按顺序翻转其中几个精灵,就可以欺骗观众的眼睛,让他们相信自己看到的是真正的运动和动画。但是,在3D游戏中,事情没有那么简单。在具有第三根轴的世界里,对象需要具有体积才能欺骗眼睛。由于游戏中包含大量的对象,所以我们需要快速处理出现的事情。网格,简单地说就是一系列互连的三角形。这些三角形彼此相连,构成了条带,然后组成基本的形状,最后再构成复杂的图形。这些条带提供了模型的3D定义,可以非常快地进行处理。尽管如此,也不要担心,Unity 会帮你处理好一切,不必你亲自管理它。在本章的后面,你将会看到三角形怎样组成了 Unity Scene 视图中的各种形状。
注意:为什么是三角形?
你可能想知道为什么 3D 对象完全由三角形组成。答案很简单:计算机将图形按照一系列的点来处理,也就是我们通常说的顶点。对象所具有的顶点越少,绘制速度就越快。三角形具有两个性质让人们非常喜欢。第一个性质是当有了一个三角形的情况下,只需要再添加另一个顶点,就可以创建一个新三角形。所以创建一个三角形需要3个顶点,创建两个三角形只需要4个点,创建3个三角形只需要5个顶点。这使得它们非常高效。另一个性质是:通过使用这种三角形联合在一起形成的形状,你可以对任何3D对象进行建模。其他任何形状都不具备这样的灵活性和性能。
注意:术语:模型还是网格
术语模型(model)和网格(mesh)很相似。通常可以互换使用它们。不过,它们之间也有区别。网格包含定义3D对象的形状的顶点信息。当我们谈论模型的形状或形式时,实际上说的是网格。因此,网格也称作模型的地理信息,所以模型就是包含网格的对象。
模型使用网格定义它的维度,但它也可以包含动画、纹理、材质、着色器及其他网格。一般的规则是:如果一个对象包含除顶点信息以外的任何其他内容,那么它就是模型,否则就是网格。
注意:2D
本章主要讨论渲染3D对象相关的内容,如果只想制作2D游戏,那么什么内容最实用呢?还需要学习本章的知识(或者说任何有关3D的内容)吗?当然需要!就像我们在第2章中说到的那样,根本就没有纯粹的2D游戏。精灵只不过是作用于平面的3D对象。灯光也可以应用在2D对象上。甚至2D和3D使用的摄像机都是一样的。这里学到的所有内容都可以应用在2D游戏中,因为2D游戏包含在3D游戏内。使用Unity勤加练习,你会发现2D游戏和3D游戏的界限非常模糊。
3.1.1 内置的3D对象
Unity有几种基本的内置网格(或图元)可以使用。它们提供了一些简单的形状,可以用在简单的功能上,或者将它们组合在一起构建复杂的对象。图3-1显示了可用的内置网格(前面的章节中我们已经接触过立方体和球体)。
提示:使用简单的网格建模
你是否遇到过在游戏中需要一个复杂的对象,但却找不到合适的模型的情况?在 Unity 中嵌套对象可以让你轻松地使用内置的网格创建简单的模型。只需把网格挨着放在一起,让它们组成你想要的模型的粗略外观即可。然后把所有的对象都嵌套在一个中心对象之下。这样,当移动父对象时,所有的子对象也会被移动。这可能不是在游戏中创建模型的最优雅的方式,但它在原型制作的过程中非常实用。
3.1.2 导入模型
内置的模型很不错,但是大多数时间,游戏需要复杂的艺术资源。幸好,Unity允许将你自己的3D模型导入到项目中。操作非常简单,只需把包含3D模型的文件放入Assets文件夹中,就导入到项目中了。之后,可以把它拖入场景或层次结构中,围绕它构建游戏对象。Unity天生支持.fbx、.dae、.3ds、.dxf和.obj文件,所以基本上你能够使用几乎所有的3D建模工具。
导入自己的3D模型
按照下面的步骤操作,就可以将自定义的3D模型导入到Unity项目当中。
- 创建一个新的Unity项目或场景。
- 在Project视图中,在Assets文件夹下创建一个名为Models的新文件夹,右键单击Assets 文件夹,然后选择Create > Folder命令。
- 在本书配套文件的Hour 3 文件夹中找到Torus.fbx 文件。
- 将操作系统的文件管理器和Unity编辑器并排摆放,在文件管理器中单击Torus.fbx文件,然后把它拖到你在第2步中创建的Models文件夹中。在Unity里单击Models文件夹,查看新的Torus文件。如果操作正确,Project视图将类似于图3-2中展示的样子。(注意:如果你使用的是早期版本的Unity,或者更改了Unity设置,可能会发现自动创建了一个Materials文件夹。遇到这种情况不要慌张,我们会在后面的章节介绍材质相关的知识。)
- 将Torus从Models文件夹拖到Scene视图中。注意Torus游戏对象添加到场景中的时候包含一个网格过滤器和一个网格渲染器。这两个组件可以让Torus对象显示在屏幕上。
- 当前场景中的Torus非常小,所以我们在项目视图中选中Torus资源,然后在Inspector视图中查看。将缩放系数从1改为100,然后点击Inspector下面的Apply按钮。
警告:网格默认的缩放大小
Inspector视图中网格的大多数选项都是高级选项,我们不会很快讲解它们的用法。现在我们感兴趣的属性是比例因子。不同的软件可能有不同的缩放比例。默认情况下,Unity将一个单元作为一米,其他软件,比如说Blender可能将一个单元视为一厘米。一般情况下,当你导入一个模型的时候,Unity会自动推断导入的模型的缩放比例。有的时候,比如在本例中,它就没有正确推断,所以需要你手动调节缩放系数。将缩放系数从1更改到100,也就是告诉Unity将模型放大100倍,从而将以厘米为单位的模型转化为以米为单位的模型。
3.1.3 模型和Asset Store
你不需要成为建模专家也能使用 Unity 创建游戏。Asset Store 提供了一种简单有效的方式来查找预制的模型并把它们导入到项目中。一般来说,Asset Store 上的模型分免费或付费两种,它们要么是独自发布,要么存在于相似模型的集合中。一些模型自带纹理,还有一些只包含网格数据。
在Asset Store中下载模型资源
让我们学习如何从 Unity Asset Store 中查找和下载模型。按照下面的步骤操作,找到一个名为 Robot Kyle的模型,然后把它导入到我们的场景中。
- 创建一个新场景(使用File > New Scene 命令)。在Project 视图的搜索栏中输入Robot Kyle t:Model(见图3-3)。
- 在搜索筛选区域中,单击Asset Store按钮(如图3-3所示)。如果看不到这个按钮,那么可能需要调整编辑器窗口或者Project视图窗口的大小,当然,也需要保证因特网处于连接的状态。
- 选中Unity Technologies发布的名为Robot Kyle的模型。选中一个资源,然后在Inspector视图中就可以查看发布者的信息(见图3-4)。
- 在 Inspector 视图中,单击 Import Package按钮。此时,可能需要你提供Unity账户凭证(Account Credential)。如果这一步操作有困难,没关系,随书资源中我已经附带了这个资源,只需要导入它即可。
- 打开Import Package 对话框后,保持一切都处于选中状态,并选择Import。
6.在Assets > Robot Kyle > Model 下找到机器人模型,然后把它拖到Scene视图中,注意此时模型在Scene视图中可能相当小,需要靠近一些才能查看它。
3.2 纹理、着色器和材质
对于不熟悉过程的新手来说,将图形应用到3D模型的过程可能会让人产生畏难情绪。Unity提供了一种简单、特定的工作流程,它能让你精确掌控物体的表现,这种能力相当强大。图形资源可以分解为纹理、着色器和材质。每个概念都会在单独的一节中介绍,图3-5 显示了它们是如何密切协作的。注意,纹理并不会直接应用于模型,而是把纹理和着色器应用于材质。然后再把那些材质应用于模型。这样,无须许多工作就能快速、干净地替换或修改模型的外观。
3.2.1 纹理
纹理是应用于 3D 对象的平面图像。它们负责将模型变成色彩斑斓令人着迷的游戏对象,而不是单调生硬的形状。将2D图像应用于3D模型听上去可能有些奇怪,但是一旦你熟悉了这个过程,就会发现它真的很直观。我们来看一个汤罐头。如果你取下罐头的标签,就会看到它是一张平面的纸。这个标签就像是纹理。打印完标签之后,用它将罐头包装起来,这样就能够吸引顾客的目光。
和所有其他的资源一样,很容易在 Unity 项目中添加纹理。首先为纹理创建一个文件夹,Textures 是一个不错的文件夹名。然后把想要添加到项目中的纹理拖到你刚刚创建的Textures文件夹中。大功告成!
注意:展开操作
将纹理的工作过程想象成罐头的包装固然不错,但是更复杂的对象应该如何操作呢?在创建一个错综复杂的模型时,生成所谓的展开(unwrap)是一种常见的做法。展开有点像贴图,它准确显示了平面纹理将如何包装在模型周围。如果查看本章前面 Robot Kyle下的 Textures 文件夹,就会看到一个Robot_Color纹理。它看上去比较奇怪,这是因为它是用于模型的unwrap纹理。unwrap、模型和纹理的生成是一种艺术,本书不会讨论它们。现在这个阶段,初步了解它们的工作原理就足够了。
警告:怪异的纹理
在本章后面将对模型应用一些纹理。你可能会发现纹理有点弯曲或者在朝着错误的方向往上翻转,现在我们只需知道这并不是什么错误即可。将一个基本的矩形2D纹理应用到模型上,就会出现这个问题。模型不知道哪种方式是正确的,因此它将尽其所能地应用纹理。如果想避免这个问题,可以使用为正在制作的模型设计的专门的纹理。
3.2.2 着色器
如果模型的纹理决定了它在表面上绘制什么内容,那么着色器就确定了如何绘制纹理。还有一种看待着色器用途的方式:材质是你和着色器之间的接口。材质告诉你着色器如果要绘制对象需要什么东西,你提供它想要的资源,这样它就可以按照你想要的方式绘制对象。现在还有些难以想象,但是后面当我们创建材质时,你就会理解它们是如何工作的。因为无法在没有材质的情况下创建着色器,本章后面将会介绍大量关于着色器的知识。事实上,关于材质要学习的大量内容实际上是材质的着色器的知识。
提示:思考练习
如果你现在理解着色器的工作方式比较费力,那么可以考虑下面这种场景:假设你有一块木头。木头的物理性是它的网格。颜色、质地和可见的元素就是它的纹理。现在拿起木头,往上浇一些水。木头的网格还是原来的网格,它还是由原来的材料(木头)组成,但是看上去有些不同。它稍微暗了一点并且富有光泽。这个例子中有两个“着色器”:干木头和湿木头。湿木头“着色器”添加了一些东西,让它看起来有些不同,但实际上并没有改变它。
3.2.3 材质
如前所述,材质差不多就是可以应用于模型的着色器和纹理的容器。自定义材质的大部分工作就是为它选择着色器,尽管所有的着色器都具有一些共同的功能。
要创建一种新材质,首先要创建一个Materials文件夹。然后右键单击该文件夹,再选择Create > Material 命令。给材质起个有意义的名称,这样就可以了。图3-6展示了两个使用不同着色器设置的材质。注意它们都使用了Standard着色器。每种设置的albedo(后面会详细介绍)颜色都设置为白色,但是它们的Smoothness设置不同。Flat材质的Smoothness值低一些。所以光看起来特别平,因为光会漫反射。Shiny材质的Smoothness值高,它创建了比较强的灯光效果。两种材质都可以预览,所以你可以看到它在模型上将会如何显示。
3.2.4 着色器进阶
我们已经学习了纹理、模型和着色器,现在学习怎样把它们结合在一起。Unity有一个非常强大的Standard着色器,这也是本书讲解着色器的重点所在。表3-1 展示了常见的着色器属性。除了表3-1列出的属性外,Standard着色器还有很多其他属性,但是本书主要关注列表中的这些属性。
看上去似乎有许多知识要学习,但是一旦你对纹理、着色器和材质的基础知识变得更熟悉,你会发现对这些属性的理解也就更加深刻了。
Unity还有本书没有囊括的很多其他着色器,Standard着色器的灵活性非常高,足以满足你的基础需求。
对模型应用纹理、着色器和材质
让我们按照下面的步骤把所掌握的关于纹理、着色器和材质的所有知识结合起来,创建一个看上去相当不错的砖墙效果。
- 创建一个新项目或场景。注意:创建新项目将会关闭并重新打开编辑器。
- 创建一个Textures和一个Materials文件夹。
- 在本书配套文件中找到 Brick_Texture.png 文件,并把它拖到在第2步中创建的Textures文件夹中。
- 向场景中添加一个立方体,将它放置在(0, 1, –5)处,并将它的缩放比例设置为(5, 2, 1)。图3-7显示了现在这个立方体的属性。
- 创建一种新材质(右键单击Materials 文件夹,然后选择Create > Material 命令),最后将它命名为BrickWall。
- 将着色器设置为Standard,在Main Maps中单击单词Albedo左边的小圆圈按钮图标,然后在弹出式窗口中选择Brick_Texture。
- 把砖墙材质从Project视图中拖到Scene视图中的立方体上。
- 注意纹理被拉伸得有些超出了墙面,首先选择材质,然后把拼贴的x值改为3,请确保这个操作是在Main Maps中进行,而不是Secondary Maps。现在墙面看上去好多了。现在场景中就有了一堵带有纹理的砖墙。图3-8显示了最终的效果。
3.3 本章小结
在本章中,我们认识了 Unity 中的模型。首先学习了如何利用称为顶点的集合也就是网格构建模型。然后,学习了如何使用内置的模型,导入你自己的模型,以及从Asset Store 下载模型。接着学习了 Unity 中的给模型贴图的工作流程,体验了纹理、着色器和材质的使用,最后通过创建一块纹理化的砖墙结束了本章的学习。
3.4 问答
问:如果我不是艺术家,那我还能够制作游戏吗?
答:绝对可以。使用免费的在线资源和Unity Asset Store,可以找到各种艺术资源放到游戏中。
问:我需要知道如何使用所有内置的着色器吗?
答:不用。许多着色器的使用场景非常有限。先学会本章中介绍的着色器,如果游戏项目需要,可以再学习使用更多的着色器。
问:如果 Unity Asset Store 中有付费的艺术资源,这意味着我可以出售自己的艺术资源吗?
答:是的,可以这样做。事实上,并不仅限于艺术资源。如果你可以创建高质量的其他资源,也可以在商店里出售它们。
3.5 测验
花些时间完成下面的练习,确保掌握了本章的内容。
问题
- 判断题:因为方形很简单,所以使用方形作为模型的网格。
- Unity支持什么3D模型文件格式?
- 判断题:Unity Asset Store里面只有收费资源。
- 解释纹理、着色器和材质的关系。
答案
- 错,网格是由三角形组成的。
- .fbx、 .dae、 .3ds、.dxf以及.obj 文件。
- 错,里面有很多免费资源。
- 材质包含纹理和着色器,着色器用于确定材质的属性以及材质的渲染方式。
3.6 练习
在这个练习中,我们将体验着色器对模型的外观所产生的影响。每种模型使用相同的网格和纹理,只有着色器是不同的。这个练习中创建的项目命名为 Hour3_Exercise,可以在本书配套文件的Hour 3文件夹中找到它。
- 创建一个新场景或新项目。
- 在项目中添加一个Materials 和一个Textures 文件夹。在本书配套文件的Hour 3 文件夹中找到Brick_Normal.png和Brick_Texture.png文件,把它们拖到Textures文件夹中。
- 在Project视图中,选择Brick_Texture。在Inspector视图中,把aniso级别改为3,提高曲线的纹理质量。然后单击Apply按钮。
- 在Project视图中,选择Brick_Normal。在Inspector视图中,把纹理类型改为Normal Map。然后单击Apply按钮。
- 在Hierarchy视图中选择定向灯光,把它的位置设置为(0, 10, –10),旋转角度设置为(30, –180, 0)。
- 在项目中添加4 个球体,并把它们的缩放比例都设置为(2, 2, 2)。然后把它们的位置分别设置为(1, 2, –5)、(–1, 0, –5)、(1, 0, –5)和(–1, 2, –5),这样就可以把它们分散开。
- 在 Materials 文件夹中创建4种新材质,并把它们分别命名为 DiffuseBrick、SpecularBrick、BumpedBrick和BumpedSpecularBrick。图3-9展示了4种材质对应的属性,将这个四种材质的属性按照图设置它们的值。
- 将每种材质分别拖到4个球体上。注意球体的灯光和曲度怎样与不同的着色器交互。记住,可以在Scene视图中移动,从不同的角度查看球体。