Unity着色器和屏幕特效开发秘笈(原书第2版)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-15 22:38:17

点击下载

作者:(英)艾伦·朱科尼(Alan Zucconi)

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Unity着色器和屏幕特效开发秘笈(原书第2版)

Unity着色器和屏幕特效开发秘笈(原书第2版)试读:

前言

本书介绍Unity 5中着色器的创建和后期特效开发。你可以从零开始学习创建最基本的着色器,掌握着色器代码是如何组织的。开始的基础知识可以有效地“武装”你,让你在后续如体积爆炸、毛皮着色等章节中游刃有余。本版是专门为Unity 5量身定制的,可以通过使用一些基于物理基础的渲染和全局照明来让你的场景栩栩如生。

在每一章的结尾,你都会获得一些新的技巧,比如改善着色器质量或者提升着色器代码编写效率等。这些章节都是量身定制的,所以如果你之前已经有了一些经验,完全可以直接跳到你感兴趣的章节来专门学习。对于新手来讲,可以逐章阅读来构筑整个知识体系。不管使用何种方式,你都会学到制作现代游戏视觉的技术。

在读完本书之后,你手上会有一堆已经做好的着色器,可以在你的Unity3D游戏中使用这些着色器,除此之外你会理解如何创建新的着色器,如何完成新的特效以及性能优化等。废话不多说,让我们开始吧!本书主要内容

第1章 会将你引入Unity 4和Unity 5的着色器编码世界。

第2章 介绍表面着色器中的一些非常常用的技术,包括如何给你的模型使用纹理和法线映射。

第3章 深度解析着色器是如何给光照行为建模的。本章会教你如何创建自定义光照模型来模拟一些特殊效果,比如卡通着色。

第4章 会告诉你基于物理基础的渲染是Unity 5中使用的一种模拟现实的基础技术,会教你如何最大限度地使用好基于物理基础的渲染,如何使用透明度、反射型表面和全局照明等。

第5章 会教你如何使用着色器来修改物体的几何结构。本章会引入顶点编辑器,使用它可以制作体积爆炸、雪花等生动的特效。

第6章 解释如何使用抓取功能来制作一些半透明材料形成的变形效果。

第7章 会帮助你对着色器进行一些优化,以保证游戏在各种不同设备上都能正常运转。

第8章 展示如何创建特效和其他一些除了Unity几乎不可能实现的视觉效果。

第9章 会告诉你如何通过后期特效来提升游戏的可玩性,比如夜视效果。

第10章 介绍本书中的很多高级技巧,比如毛皮着色和热度图渲染等。阅读前的准备工作

下面列出的是使用本书时所必需和可选的一些软件:

·Unity 5(必需)

·一个3D应用程序,比如Maya、Max或者Blender(可选)

·一个2D图像编辑软件,比如Photoshop或者Gimp(可选)本书的读者对象

如果你想用Unity 5来创建你的首个着色器,或者想通过一些专业的后期特效来将你的游戏提升到一个新的高度,这本书就很适合你,但是可能需要一些对于Unity的基础理解。本书结构

在本书中,你会发现有几个频繁出现的标题(准备工作、操作步骤、工作原理、更多内容、参考),这几个标题一般是这样用的:准备工作

这个部分告诉你预期要做出来的效果是什么,需要准备哪些软件和预先的设置。操作步骤

这个部分包含了实现的具体步骤。工作原理

这个部分一般是对操作步骤的详细解释。更多内容

这一部分由一些相关的附加信息组成,以方便读者对整体内容有更全面的认识。参考

这一部分会提供一些有用的链接和其他有用信息。约定

注意 注意以这种方式出现。

技巧 提示和技巧以这种方式出现。下载示例代码

本书提供相关的一些示例代码文件下载,可以访问http://www.packtpub.com/support来注册,相关文件会用电子邮件直接发给你。

下载代码文件的步骤如下:

1.通过电子邮件和密码在上述网站上登录或者注册。

2.移动鼠标到网站顶部的SUPPORT标签处。

3.点击Code Downloads&Errata。

4.输入书名,点击Search按钮。

5.选择你在查找的书籍,下载相关代码文件。

6.从下拉菜单中选择你的购买渠道。

7.点击Code Download。

文件下载之后,请使用如下解压软件进行解压:

Windows系统请使用WinRAR/7-Zip,Mac系统请使用Zippeg/iZip/unRarX,Linux系统请使用7-Zip/PeaZip。下载本书的彩图

我们还提供本书中所用到的截图、图片的彩图PDF文件,这些彩图可以让你更好地理解输出的细微差别。你可以从https://www.packtpub.com/sites/default/files/downloads/Unity5xShadersAndEffectsCookbook_SecondEdition_Graphics.pdf处下载。第1章创建你的第一个着色器

本章会讨论一些游戏开发着色流程中广泛使用的漫反射技术。在这一章中,你会学到如下内容:

·创建基本的标准着色器

·从Unity 4向Unity 5迁移

·给着色器添加属性

·在表面着色器中使用属性1.1引言

首先让我们想象一个均匀涂白的立方体。这个立方体的各个面上的颜色都是一样的,但是随着光照方向的不同,以及观察者视角的不同,各个面上呈现出来的影像都是不同的。在3D图像技术中,这种级别的拟实效果是通过着色器完成的。着色器是一种特殊的程序,主要用来模拟光照效果。一个木质立方体和一个金属立方体可以共用一个同样的3D模型,然后使用着色器就可以让它们看起来大不相同。这一章会循序渐进地介绍Unity中的着色器代码。如果你之前没有怎么接触过着色器,经过这一章你就会理解着色器是什么、它们是如何工作的以及怎么对着色器进行自定义了。

在本章的结尾,你应该已经知道了如何创建一个有些基本功能的基础着色器。有了这些知识之后,你就基本上能随心所欲地创建表面着色器了。1.2创建基本的标准着色器

每一个Unity开发人员都应该熟悉模块(component)的概念。游戏中的所有物体都会包含一系列模块,这些模块会影响它的外观和行为。一般而言脚本(script)会决定物体的行为,而渲染器(renderer)则决定了它在屏幕上呈现出来的外观。Unity有多种渲染器,根据我们想要显示的物体类型的不同,会使用不同的渲染器。每个3D模型一般都会有一个名为MeshRenderer的渲染器。一个物体可以只有一个渲染器,但是一个渲染器可以有多种材质(material)。每一种材质就是一个着色器呈现出来的外观,因此着色器也就是3D图像食物链的最后一环。这些模块之间的关系可以从下图看出:

理解了这些模块之间的不同十分有助于我们理解着色器是如何工作的。1.2.1 准备工作

在准备学习这一部分时,你需要运行Unity 5并且创建一个新的项目(project)。在本书配套的代码里面也包含这样一个初始化好的Unity项目,你可以使用这个项目作为基础,随着后续章节的深入学习来自定义你的着色器。准备好这两样东西之后,实时着色的精彩世界已经为你敞开了。1.2.2 操作步骤

在开始做着色器之前,可以先创建一个小的场景作为基础。创建场景的步骤是在Unity编辑器中选择GameObject|Create Empty。在这个场景中,可以创建一个简单的地平面,再添加几个球体来供我们的着色器使用,再添加一个平行光来照亮这个场景。创建好场景之后,可以按照如下步骤编写着色器:

1.在Project标签页中,右键单击Assets文件夹,然后选择Create|Folder。

注意 如果你使用的是本书配套的项目,可以直接跳到第4步。

2.将你创建的文件夹重命名为Shaders。重命名方式是右键单击文件夹,然后从弹出的菜单中选择Rename。或者选中文件夹后按快捷键F2(这也是Windows系统下默认的重命名快捷键)。

3.创建另外一个名为Materials的文件夹。

4.右键单击Shaders文件夹,选择Create|Shader。然后右键单击Materials文件夹,选择Create|Material。

5.将新创建的着色器和材质都重命名为StandardDiffuse。

6.在MonoDevelop(Unity默认的脚本编辑器)中双击打开StandardDiffuse着色器。Unity会自动打开该编辑器并且显示对应的着色器代码。注意 你会看到Unity已经为我们的着色器添加了一些基础代码。默认情况下,这个基础漫反射着色器会接受一个纹理。你可以在这些基础代码的基础上,快速自定义自己的着色器。

7.现在我们需要声明着色器所在的自定义位置。着色器中的第一行代码就是我们指定给着色器的自定义路径,只有这样Unity才会知道这里有一个着色器,在给材质指定着色器的时候,该着色器才会出现在下拉菜单中。我们已经将路径重命名为“CookbookShaders/StandardDiffuse”,但是你完全可以按照自己的喜好给它换个名字。现在不用担心它有任何依赖。在MonoDevelop中保存着色器,然后返回Unity编辑器。Unity在识别到着色器文件发生改动时,会自动编译着色器相关代码。确保你的着色器代码是这样的:

8.技术上来讲,这是一个基于物理基础渲染(physically-based rendering)的表面着色器。在Unity 5中已经将物理基础渲染作为标准。顾名思义,这种着色器会通过模拟光照到物体上来获得真实感。如果你使用的是之前版本的Unity(比如Unity 4),代码会大不相同。在引入物理基础渲染之前,Unity 4并没有多少精细技术。关于不同类型着色器的介绍会在本书后面章节中详细展开。

9.在创建好着色器之后,我们需要将其关联到一种材质上。选择第4步中创建的名为StandardDiffuse的材质,从Shader下拉菜单中查看Inspector标签页,选择CookbookShaders|StandardDiffuse(如果你使用的路径与本书不同的话,看到的着色器路径也会有所不同)。这个操作就会将之前的着色器指定给该材质,接下来你就可以将这个材质指定给某个物体了。

注意 将材质指定给物体的步骤是:从Project标签页中将材质拖曳到场景中的物体上。或者将材质拖曳到物体的Inspector标签页中也可以。

做完上述步骤之后的例子应该看起来和下面差不多:

现在还没什么好看的,但是我们的着色器开发环境已经准备好了,可以按照需要来修改着色器了。1.2.3 工作原理

Unity有一些帮助你准备着色器环境的指令,让你事半功倍。只需要简单地单击几下就已经准备好了。其实在表面着色器的背后,有很多元素在协同工作。Unity使用的是Cg着色器语言,但是针对该语言做了很多优化和提升,以帮助你高效地编写着色器代码。表面着色器语言更多的是一种基于组件的编码方式。诸如处理纹理坐标和转换矩阵的事情,Unity都已经为你做好了,所以你不用完完全全从头开始。放在以前,我们在创建着色器的时候要反反复复地编写大量重复代码。随着对表面着色器的了解逐步深入,你自然会对Unity如何使用这些Cg语言相关的底层函数来完成底层图像处理器(GPU)任务感兴趣的。注意 Unity中所有文件都是从它们所在的文件夹中独立引用的。我们可以在Unity编辑器中移动着色器和材质文件的位置,它们之间的链接是不会被破坏的。但是不能把文件移出Unity编辑器,一旦移出了Unity就没办法跟踪到这些文件及其引用的更新了。

在简单地修改了一下着色器路径名之后,我们已经得到了一个可以在Unity环境中正常工作的基础漫反射着色器了。我们只改了一行代码,所有的光照和阴影都已经做好了。1.2.4 参考

Unity 5中内建着色器的源代码是隐藏的,你不能从编辑器中像打开自己的着色器那样打开这些内建着色器。

如果你想知道在哪里可以找到Unity中大量的内建Cg函数,可以到Unity的安装目录,然后进入Unity45\Editor\Data\CGIncludes。在这个目录下,可以找到这些Unity中用到的着色器源码。这些源码本身也是随着时间变化的,如果你想找其他版本的着色器代码,可以去UNITY DOWNLOAD ARCHIVE(https://unity3d.com/get-unity/download/archive)查找,方法是选中正确的版本之后,从下拉菜单中选择Build in shaders,如下图所示。这里应该有三个文件:UnityCG.cginc、Lighting.cginc和UnityShaderVariables.cginc。当前这个着色器会用到所有三个文件。

在第10章中,我们会深入探讨如何使用这些CgInclude来将着色器代码模块化。1.3从Unity 4向Unity 5迁移

不可否认,电子游戏中的图像技术在过去的10年中发生了翻天覆地的变化。每一个包含前沿技术的新游戏的面世,带给我们的都是无与伦比的实时超现实体验。同样,在Unity中着色器及其相关技术也是日新月异,这种不断的更新换代很多时候也是大家产生迷惑的根源之一。在Unity 5之前,主要有两种着色器被采用:漫反射和高光着色器。顾名思义,这两种着色器分别用在无光和高光材料上。如果你已经用了Unity 5,可以跳过这一部分,这部分内容主要解释如何使用Unity 5重现这些之前的特效。1.3.1 准备工作

开始这一部分之前,我们需要准备一个Unity 4的环境。在Unity 4中同样有一些预先提供好的内建着色器。如果你是开始开发一个新游戏,毫无疑问你会使用最新版本的Unity,但是如果是个遗留项目,很有可能之前使用的就是一些低版本的Unity。在做版本迁移的时候一定要格外小心。在Unity引擎中,很多东西都发生了变化。而且就算是某些内建着色器能正常工作,脚本也可能变了。如果你准备迁移整个工作空间,首要的是要做好备份。很重要的一点是:要记住仅仅保存资源和场景文件是远远不够的,Unity中大量的配置文件保存在其元数据中。做迁移备份时最安全的方式是将包含项目的整个文件夹拷贝一份。最好的方式是从资源管理器(Windows)或者Finder(Mac)中将整个文件夹物理拷贝一份。1.3.2 操作步骤

如果你想将之前做好的着色器迁移到Unity 5,有两种方式:自动升级项目或统一切换到标准着色器。

自动升级

这是最简单的一种办法。Unity可以导入之前版本的项目并对其进行升级。你会发现,升级转换完之后,就不能用Unity 4了,哪怕你的资源文件一个都没有改动。原因是Unity的元数据已经做过转换了。自动升级的步骤是打开Unity 5,单击OPEN OTHER来选择老版本项目所在的文件夹。Unity会询问你是否需要进行转换。单击Upgrade按钮开始转换。Unity会重新导入你的所有资源文件,重新编译脚本。如果你的项目很大的话,这个过程可能持续数小时。转换完成之后,你就会发现一些改变。例如材质的Inspector栏中可能会从Bumped Diffuse变成了Legacy Shader/Bumped Diffuse。

注意 即使Unity 4中的诸如漫反射、镜面反射等着色器都已经废弃了,Untiy 5还是保持了良好的向下兼容性。你可以在材质的下拉菜单中的Legacy Shaders目录下找到这些遗留着色器。

使用标准着色器

如果不想继续使用遗留的着色器,可以使用Unity 5中新的标准着色器来取而代之。在替换之前,需要记住一点:这两者是基于不同的光照模型来构建的,因此肯定会影响材质本身的外观。Unity 4中有超过80种不同的内建着色器,总共分为6个大类(普通、透明、透明剪切、自照明和反射类等)。在Unity 5中,全都被标准着色器取代。不幸的是,并没有什么魔法可以将你的着色器直接转换成标准着色器,但是你可以通过下面这个表格来理解如何配置Unity 5中的标准着色器来模拟Unity 4中那些遗留的着色器:

可以使用Inspector中的Shader下拉菜单来让老的材质使用这些着色器,只需要选择合适的标准着色器即可。如果你的老着色器使用了纹理、颜色和法线映射,这些属性会自动应用在新的标准着色器中。你可能还是需要配置一些标准着色器的参数来让它跟之前的光照模型保持一致。下图展示的是一个斯坦福兔子在旧的漫反射着色器(右图)、转换成标准着色器(左图)和光滑度(Smoothness)调为0的标准着色器(中图)中的显示效果:

迁移自定义着色器

如果你在Unity 4中写过自定义着色器,大部分情况下在Unity 5中可以直接使用这些代码。除此之外,Unity 5中对着色器的工作方式做了些微调,因此可能会引起一些错误或者矛盾。最重要的一点修改是光的亮度。Unity 5中的光亮度是Unity 4中的两倍。所有老的着色器在重写的时候都考虑到了这一点。如果你升级一些内建着色器,或者切换到标准着色器,不会发现任何问题。但是如果你重写过自己的光照模型,需要注意新环境下光亮度不再需要乘以2倍了。下面这段代码可以确保这一点:

如果你没写过着色器也不用害怕。光照模型相关内容会在第3章中详细解释。

注意 相比于Unity 4,Unity 5在着色器的处理方式上还有一些其他方面的改动。你可以在http://docs.unity3d.com/Manual/Upgrade Guide5-Shaders.html的Shaders in Unity 5.0中找到更详细的改动说明。1.3.3 工作原理

制作着色器始终要考虑性价比。拟实效果好的着色器需要占用大量的计算资源,在某些设备上可能会引起延时。一般而言特效最好应用在一些非常重要、缺之不可的地方。如果某种材质并不需要高光反射,那么就没有必要专门用一个着色器来计算高光效果。这也是Unity 4中引入了如此多不同的着色器的原因之一。Unity 5中的标准着色器理论上可以替代之前的所有着色器,因为标准着色器集合了法线映射、透明和反射功能。但是在Unity 5中进行了某些合理的优化,以确保只计算那些真正必需的特效。如果你的标准材质并没有反射效果,那么Unity 5是不会计算这一部分的。

除此之外,标准着色器主要是为拟实材质而设计的。相对而言,老的漫反射和高光着色器并不是为拟实材质而设计的。这也是从老的着色器迁移到标准着色器时,需要对物体的渲染方式做一些修改的原因之一。1.3.4 参考

·第3章深入讲解了漫反射着色器和高光着色器是如何工作的。即使在Unity 5中这些着色器已经废弃了,理解它们的原理对于你设计新的光照模型也是大有裨益的。

·第4章将会向你展示如何释放Unity 5中的标准着色器的更多潜力。1.4给着色器添加属性

着色器的属性非常重要,可以通过着色器的属性来让美工或者用户给着色器指定纹理或者对着色器进行微调。通过属性你可以在材质Inspector标签页中展示一些GUI元素,而不用另外再开一个编辑器,是一种可视化的调试方法。

在MonoDevelop中打开之前的着色器代码,看看第2行到第7行。这部分被称为Properties(属性)代码块。当前着色器中只有一个属性,名为_MainTex。如果查看之前应用了该着色器的材质,你会发现Inspector标签页中有一个texture(纹理)GUI元素。这一段属性代码块为我们创建了这个GUI元素。

再重申一次,Unity可以让编码和属性生效的过程非常高效。1.4.1 准备工作

下面我们将试着创建一些自己的属性,同时学习一些着色器的语法来帮助我们理解StandardDiffuse着色器是如何工作的。在下面这个例子中,我们会对之前的着色器进行一些修改。我们不再使用纹理,而是使用一些颜色和其他一些可以在Inspector标签页中直接修改的属性。我们首先拷贝一份StandardDiffuse着色器,步骤是在Inspector标签页中选中,然后按Ctrl+D,这样会自动拷贝一份,并且命名为StandardDiffuse2。

注意 可以通过修改着色器中的第一行代码来给着色器重新起个名字,例如“CookbookShaders/StandardDiffuse”,Unity会知道需要将这个名为StandardDiffuse的着色器放到CookbookShaders组下。如果是用Ctrl+D来拷贝的,新的文件会共用被拷贝文件的名字。为了避免混淆,可以通过修改第一行代码来给每一个着色器指定一个唯一的名字。1.4.2 操作步骤

一旦StandardDiffuse2准备好了,可以按照如下步骤来修改其属性:

1.在着色器的Properties代码块中,通过删除下面代码来移除当前属性:

2.现在因为已经把最基本的属性给移除了,在删除_MainTex的引用之前,着色器代码不会被编译。再删除下面这一行:

3.原来的着色器使用了_MainTex来给模型上色,可以通过修改surf()函数的第一行代码来进行替换:

4.保存文件并回到Unity中,着色器代码会被编译,然后就可以看到材质的Inspector标签页现在没有纹理样本了。要完成这个着色器的替代,可以再多添加一点属性看看会怎么样,接着上面输入下述代码:

5.我们已经给Inspector标签页添加了另外一个颜色样本,现在再试试添加另一种属性,将下述代码添加到Properties代码块中:

6.现在已经创建了另外一个可视化的GUI元素,通过这个GUI元素我们可以与着色器进行一些视觉互动。这次我们创建了一个名为This is a Slider的滑块,如下图所示:

通过属性,可以可视化地对着色器进行微调,而不用深入修改着色器的代码。下一节会讲解如何将这些属性真正地用起来。

注意 属性属于着色器所有,但是属性的值确实存储在材质中。同样一个着色器可以用在不同的材质上。另一方面,修改材质的属性会影响到所有应用了这种材质的物体的外观。1.4.3 工作原理

每个Unity着色器都会有一种查询自身代码的内建结构。Properties代码块就属于这种Unity会查找的函数。这背后的原因是给着色器程序员提供一种快速创建与着色器代码进行绑定的GUI元素的方法。在Properties代码块中声明的属性可以用在着色器代码中来修改着色器的值、颜色和纹理。定义属性的语法如下所示:

我们一起看一下这个语法。在你开始写一个新的属性的时候,需要赋给属性一个变量名(Variable Name),着色器代码可以通过这个变量名来获取GUI元素的值。这一设定为我们节省了很多时间,因为这样一来我们不用自己准备系统。

属性的下一个元素是审查器GUI名(Inspector GUI Name)和属性的类型(Type),也就是括号中的两个。审查器GUI名是调试的时候出现在材质的Inspector标签页中的名字。类型是该属性将会控制的数据类型。在Unity着色器中可用的类型有很多,下表列出了所有我们在着色器中应用的类型:

最后是默认值(Default Value),顾名思义就是默认情况下该属性在代码中的值。所以在前面的示例图片中,名为_AmbientColor的属性的默认值是(1,1,1,1)。这是一个Color类型的值,表示的是一种4位浮点的RGBA颜色(r,g,b,a=x,y,z,w)。这个颜色属性首次创建的时候是白色的。1.4.4 参考

Unity手册中关于属性的文档放在这里:http://docs.unity3d.com/Documentation/Components/SL-Properties.html。1.5在表面着色器中使用属性

我们已经创建了一些属性,现在在着色器中开始试着把这些属性用起来,通过这些属性让材质的微调过程更加高效。

可以通过材质的Inspector标签页得到这些属性的值,因为我们给属性绑定了一个变量名。但是在通过变量名访问属性值之前,要先准备一些东西。1.5.1 操作步骤

下面是在表面着色器中使用属性的步骤:

1.因为我们在1.2节中已经删除了_MainTex,所以开始之前,先移除下面几行代码:

2.接下来,在着色器中的CGPROGRAM行之下添加如下代码:

3.第2步完成之后,可以在着色器中使用属性的值了。我们先将_Color属性和_AmbientColor属性的值相加之后,赋给o.Albedo,所以在surf()函数中添加下面的代码:

4.最终的着色器代码应该看起来像下面这样。如果你在MonoDevelop中保存代码然后在Unity中打开,着色器会被自动编译。如果没有错误的话,可以修改材质的环绕色和发光色了,也可以通过滑块来增加最终颜色的饱和度等值。就是这么智能!

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载