Unity Shader入门精要

978-7-115-42305-4
作者: 冯乐乐
译者:
编辑: 张涛
分类: Unity

图书目录:

详情

全书共分为五大篇章,基础篇将为初学者普及基本的理论知识,以及所需的数学基础;Shader初级篇将从最简单的shader开始,讲解shader中基础的光照模型、纹理、和透明效果等。同时,还会对shader的Debug技巧进行详细阐述;Shader中级篇是进阶篇章,将讲解更加复杂的光照、高级纹理、以及如何如脚本交互等一系列进阶内容.

图书摘要

版权信息

书名:Unity Shader入门精要

ISBN:978-7-115-42305-4

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

• 著    冯乐乐

  责任编辑 张 涛

• 人民邮电出版社出版发行  北京市丰台区成寿寺路11号

  邮编 100164  电子邮件 315@ptpress.com.cn

  网址 http://www.ptpress.com.cn

• 读者服务热线:(010)81055410

  反盗版热线:(010)81055315


本书不仅要教会读者如何使用Unity Shader,更重要的是要帮助读者学习Unity中的一些渲染机制以及如何使用Unity Shader实现各种自定义的渲染效果,希望这本书可以为读者打开一扇新的大门,让读者离制作心目中优秀游戏的心愿更近一步。

本书的主要内容为:第1章讲解了学习Unity Shader应该从哪里着手;第2章讲解了现代GPU是如何实现整个渲染流水线的,这对理解Shader的工作原理有着非常重要的作用;第3章讲解Unity Shader的实现原理和基本语法;第4章学习Shader所需的数学知识,帮助读者克服学习Unity Shader时遇到的数学障碍;第5章通过实现一个简单的顶点/片元着色器案例,讲解常用的辅助技巧等;第6章学习如何在Shader中实现基本的光照模型;第7章讲述了如何在Unity Shader中使用法线纹理、遮罩纹理等基础纹理;第8章学习如何实现透明度测试和透明度混合等透明效果;第9章讲解复杂的光照实现;第10章讲解在Unity Shader中使用立方体纹理、渲染纹理和程序纹理等高级纹理;第11章学习用Shader实现纹理动画、顶点动画等动态效果;第12章讲解了屏幕后处理效果的屏幕特效;第13章使用深度纹理和法线纹理实现更多屏幕特效;第14章讲解非真实感渲染的算法,如卡通渲染、素描风格的渲染等;第15章讲解噪声在游戏渲染中的应用;第16章介绍了常见的优化技巧;第17章介绍用表面着色器实现渲染;第18章讲解基于物理渲染的技术;第19章讲解在升级Unity 5时可能出现的问题,并给出解决方法;第20章介绍许多非常有价值的学习资料,以帮助读者进行更深入的学习。

本书适合Unity初学者、游戏开发者、程序员,也可以作为大专院校相关专业师生的学习用书,以及培训学校的培训教材。


2004年,有3位年轻人在开发他们的第一款游戏失利后,决定在丹麦首都哥本哈根建立一家游戏引擎公司。最初,他们的想法是要让全世界的开发人员可以使用最少的资源来创建出他们喜欢的游戏。谁也不曾想到,十年以后,这个起初并不起眼的公司已经发展成为游戏引擎公司巨头,而他们的游戏引擎也成为世界上应用最广泛的游戏引擎。没错,这个公司就是Unity Technologies,这3位年轻人分别是公司创始人David Helgason(CEO)、Nicholas Francis(CCO)和Joachim Ante(CTO)。而这3位创始人的初衷也得以实现,截止到2014年,全世界有超过300多万的开发者在使用游戏引擎Unity来开发游戏,更有6亿玩家在玩由Unity引擎制作的游戏。这股“Unity热”一直持续到现在。

虽然Unity引擎上手快,操作界面简单快捷,但许多Unity开发者却发现,当他们需要在Unity中实现一些特殊的画面效果时,往往无从下手。这些画面效果的实现通常和渲染有关,更具体来说,我们通常需要在Unity中编写一些Unity Shader文件来实现它们。一方面,对渲染知识的缺乏和对Shader的不了解导致很多开发者在这条路上举步维艰;另一方面,对游戏画面的提升是越来越多游戏公司的诉求。然而,Unity官方文档中不仅缺少对渲染原理讲解的内容,对Unity Shader本身的一些工作机制(概括来说,Unity Shader是Shader上层的一个抽象)同样缺少相关资料。同时,市面上能适应初学者的Unity Shader书少之又少,基于这些原因,使得我想要编写这样一本书来帮助开发者渡过困境。

本书旨在从基础开始,帮助读者逐渐了解并掌握如何编写Unity Shader。本书不仅仅是要教会读者“如何使用Unity Shader”,更重要的是要帮助读者建立对渲染流程的基本认识,在此基础上,帮助读者学习Unity中的一些渲染机制以及如何使用Unity Shader实现各种自定义的渲染效果。我相信,让读者首先了解原理再进行实践,相比于大量堆砌代码是更好的学习方法。因此,本书在开始实践前,均会为读者讲解大量的原理,让读者在学习时不再一头雾水。

尽管本书专注于学习Unity Shader,但根据我的学习经验来看,在不了解基础的渲染流程和基本的数学知识前,想要深入学习Shader的编写是非常困难的。实际上,Shader仅是整个渲染流程的一个子部分,因此,任何脱离渲染流程的对Shader的讲解可能会让读者更加困惑。而向量运算、矩阵变换等数学知识在Shader的编写中无处不在,因此,这些数学知识往往也是让初学者对Shader望而却步的原因。基于上面的两点观察,本书的安排从易到难,由基础到深入。我们把全书分为了5篇,读者可以在第1章中看到这些章节的具体安排。

随着硬件的发展,Shader的能力也越来越大。如果问你,一个Shader可以做什么?你可能会回答渲染游戏模型、模拟波动的海面、实现各种屏幕特效等。但如果告诉你,上面所示的3张图片完全依靠一个片元着色器来渲染实现,没有借助任何外部模型和纹理,你可能会觉得非常不可思议!读者可以在Shadertoy网站上看到许多这样的例子。例如,上面的小雨伞、五彩的小方块,以及飘动的气球(由于本书是黑白印刷,一些效果无法显现)。一个简简单单的Shader可以做到什么程度的效果,我们已经不可预期。本书的重点不在于教读者如何单纯使用Shader来实现上面的效果,而在于如何让Shader和其他游戏开发元素(例如,模型、纹理、脚本等)相配合,实现游戏中常见的渲染效果,我们在此只想说明Shader可能远比你想象的要强大得多。我们真诚地希望本书可以带领读者走进Shader的世界,让读者理解Shader、掌握Shader,和我们一起享受这样一个奇妙的游戏开发世界!

本书面向Unity Shader初学者和程序员,尽量在本书的基础篇中介绍那些必要的基础知识,但仍然希望读者可以具备如下知识。

如果你满足上面几点小小的条件,那么恭喜你,现在你可以安心地继续阅读本书了!

任何想要了解渲染基础或想要自由地使用Unity Shader编写渲染效果的开发者均可阅读本书。这些开发者不仅限于进行游戏开发的程序员,也包括那些渴望更加自由地在Unity中实现各种画面效果的美工人员、在校学生和爱好者等。

与国内市场已有的介绍相关内容的书籍和资料相比来说,本书有一些独有的特色。

总而言之,我希望你可以从这本书中学到许多有价值的内容,并能够享受这个过程。相信我,这些内容很有趣。

读者可以在开源网站github(https://github.com/ candycat1992/Unity_Shaders_Book)上下载本书的源代码。在编写本书时,我们使用的是当时Unity的最新版Unity 5.2.1(免费版),并在Mac 10.9.5平台和Windows 8平台下验证了代码的正确性。本书源代码的组织方式大多按资源类型和章节进行划分,主要包含了以下关键文件夹。

文 件 夹

说  明

Assets/Scenes

包含了各章对应的场景,每个章节对应一个子文件夹,例如第7章所有场景所在的子文件夹为Assets/Scenes/Chapter7。每个场景的命名方式为Scene章号小节号_次小节号,例如7.2.3节对应的场景名为Scene_7_2_3。如果同一个小节包含了多个场景,那么会使用英文字母作为后缀依次表示,例如7.1.2节包含了两个场景Scene_7_1_2_a和Scene_7_1_2_b

Assets/Shaders

包含了各章实现的Unity Shader文件,每个章节对应一个子文件夹,例如第7章实现的所有Unity Shader所在的子文件夹为Assets/Shaders/Chapter7。每个Unity Shader的命名方式为ChapterX-功能,例如第7章使用渐变纹理的Unity Shader名为Chapter7-RampTexture

Assets/Materials

包含了各章对应的材质,每个章节对应一个子文件夹,例如第7章所有材质所在的子文件夹为Assets/ Scenes/Chapter7。每个材质的命名方式与它使用的Unity Shader名称相匹配,并以Mat作为后缀,例如使用名为Chapter7-RampTexture的Unity Shader的材质名称是RampTextureMat

Assets/Scripts

包含了各章对应的C#脚本,每个章节对应一个子文件夹,例如第5章所有脚本所在的子文件夹为Assets/Scripts/Chapter5

Assets/Textures

包含了各章使用的纹理贴图,每个章节对应一个子文件夹,例如第7章使用的所有纹理所在的子文件夹为Assets/Textures/Chapter7

除了上述文件夹外,源代码中还包含了一些辅助文件夹。例如,Assets/Editor文件夹中包含了一些需要在编辑器状态下运行的脚本,Assets/Prefabs文件夹下包含了各章使用的预设模型和其他常用预设模型等。

尽管我们在本书的编写过程中多次检查内容的正确性,但书中难免仍然会出现一些错误,欢迎读者批评指正。读者可以将问题反映到本书源代码所在的github讨论页(https:// github.com/candycat1992/Unity_Shaders_Book/issues),此网址也是本书源代码下载地址,该地址中也包括本书示例彩色图文档。也可以发邮件(lelefeng1992@gmail.com)联系作者,本书答疑QQ群为438103099。

编辑联系邮箱为zhangtao@ptpress.com.cn。

首先,我要感谢《Unity 3D ShaderLab开发实战详解》一书的作者郭浩瑜老师,是他向出版社的推荐才导致了本书的编写和出版,并给了我许多在书籍编写过程中的建议和帮助。

感谢卢鹏先生,在本书编写过程中,我们进行了很多关于优化、效果实现等方面的讨论,这些讨论让本书的内容更加丰富。卢先生的乐于分享和好学的精神让我十分敬佩。

我也要感谢我的家人,我的父母和姐姐,是你们在背后的默默支持让我走到了今天,永远爱你们。还要感谢我的男朋友之之,在我遇到瓶颈时,永远是你的鼓励和支持让我走出困境。也是你的帮助,让本书现在的封面得以呈现在读者面前。

除此之外,从开始编写本书到完成之时,很多网友给了我莫大的鼓励和可贵的建议,我从未想到有这么多素未谋面的朋友在关注着本书的进展,感谢你们,是你们让我更加有动力写完本书。

感谢宣雨松和罗盛誉老师在百忙之中为本书写推荐序,谢谢你们的鼓励和支持。

最后,我要感谢人民邮电出版社的编辑张涛,是您的热情鼓励让我对本书的未来满怀希望。谢谢您对本书在内容编排、封面设计等方面的意见和建议,让这本书变得更好。感谢对本书进行修改和排版的出版社工作人员,是你们让这本书更完美地呈现在读者面前。

作者


这是很重要的一篇,尽管在本篇中我们没有进行真正的代码编写,但本篇会为初学者普及基本的理论知识以及必要的数学基础,为读者顺利步入Unity Shader学习打下很好的基础。

第1章 欢迎来到Shader的世界

欢迎来到Shader的世界!我们曾不断听到周围有人提出类似的问题:“Shader是什么”“我应该看哪些书才能学好Shader”“学习Unity Shader,我应该从哪里着手”。我希望这本书可以告诉你这些问题的答案。让你离制作心目中优秀游戏的心愿更近一步。

第2章 渲染流水线

这一章讲解了现代GPU是如何实现整个渲染流水线的,这些内容对于理解Shader的工作原理有着非常重要的作用。

第3章 Unity Shader基础

这一章将讲解Unity Shader的实现原理和基本语法,同时也将为读者解答一些常见的困惑点。

第4章 学习Shader所需的数学基础

数学向来是初学者面对的一大学习障碍。然而,在初级阶段的渲染学习中,我们需要掌握的数学理论实际上并不复杂。这一章将为读者讲解渲染过程中常见的数学知识。这章内容可以帮助读者理解Shader中的数学运算,我们在讲解过程中以一个具体的例子来阐述“一头奶牛的鼻子是如何一步步被绘制到屏幕上的”。


欢迎来到Shader的世界!我们曾不断听到周围有人提出类似的问题:“Shader是什么”“我应该看哪些书才能学好Shader”“学习Unity Shader,我应该从哪里着手”。我们希望这本书可以告诉你这些问题的答案。如果本书是你学习Shader的第一本书,我们希望这本书可以为你打开一扇新的大门,让你离制作心目中的优秀游戏的心愿更近一步;如果不是,我们同样希望这本书可以让你更深入地理解Shader的方方面面,在学习Shader的过程中更上一层楼。

有人说,程序员的三大浪漫是编译原理、操作系统和图形学(是的,我已经听到很多人在反驳这句话了,不要当真啦)。不管你是否认同这句话,我们只是想借此说明图形学在程序员心目中的地位。正在看此书的你,想必多多少少都对图形学或者渲染有一定兴趣,也许你想要通过此书来学习如何实现游戏中的各种特效,也许你仅仅是好奇那些绚丽的画面是如何产生的。我们是程序员中的“外貌协会”,期待着用代码编写出一个绚丽多姿的世界。这就是我们的浪漫。

我想,读者大概都经历过这样的场景:当你在游戏里看到那些出色的画面时,你很好奇这样的游戏是如何制作出来的,更具体的是,这样的渲染效果是如何得到的。于是你搜索后发现,这个游戏是Unity引擎开发的,更巧的是,Unity也是你熟知的引擎!于是你继续搜索,想要知道如何在Unity里实现这样的效果,最后,你往往会得到“要编写自己的Shader”这样的答案。总算有了一些头绪,你继续在网络上搜索如何学习编写Shader。于是你看到了很多文章,这些文章告诉你Unity Shader有哪些语法,一个普通的漫反射或者边缘高光的效果的代码是什么样子的。然后,你把这些代码粘贴到Unity中,保存后运行,效果出现了!一切看起来好像都很顺利,可是,当你仔细阅读这些代码时,却往往没有头绪。你不知道为什么要有一个名为vert和frag的函数,它们是什么时候调用的,为什么vert函数里要进行一些矩阵运算,这些矩阵是用来做什么的,为什么当你按照C#里面的一些语法编写时Shader却报错了。这些疑问大大影响了你学习Shader的信心,你开始觉得这是一个比学习C#难许多倍的事情,怀疑自己是不是还不具备学习如何编写Shader的基础。

如果上面的情景和你的经历有些类似,那么相信我,有很多人和你有一样的烦恼。事实上,我们之所以会觉得学习Shader比学习C#这样的编程语言更加困难,一个原因是因为Shader需要牵扯到整个渲染流程。当学习C++、C#这样的高级语言时,我们可以在不了解计算机架构的情况下仍然编写出实现各种功能的代码,这样的高级语言更符合人类的思维方式。然而,Shader并不是这样的。我们之所以要学习Shader,是想要学习如何把物体按照自己的意愿渲染到屏幕上,但是,Shader只是整个渲染流程中的一个子部分。虽然它很关键,但想要学习它,我们就需要了解整个渲染流程是如何进行的。和C++这样的高级语言不同,尽管Shader的编写语言已经达到了我们可以理解的程度,但Shader更多地是面向GPU的工作方式,所以它的一些语法对我们来说并不那么直观。因此,任何一篇只讲语法、不讲渲染框架的文章都无法解决读者的困惑。

我们希望通过本书可以帮助读者建立一个渲染流程的整体体系,这些基础是跨越Shader学习中层层障碍的重要因素。我们也相信,在学习完本书后,读者可以自行回答本章开头提出的那些问题。

我们在编写本书时尽量考虑到没有渲染基础的读者们。因此,我们把整书分成了五大篇。

这是很重要的一篇,尽管在本篇中我们没有进行真正的代码编写,但基础篇会为初学者普及基本的理论知识以及必要的数学基础。基础篇包括了以下3个章节。

第2章渲染流水线 这一章讲解了现代GPU是如何实现整个渲染流水线的,这些内容对于理解Shader的工作原理有着非常重要的作用。

第3章 Unity Shader基础 Unity在原有的渲染流程上进行了封装,并提供给开发者新的图像编程接口——Unity Shader。这一章将讲解Unity Shader的实现原理和基本语法,同时也将为读者解答一些常见的困惑点。

第4章学习Shader所需的数学基础 数学向来是初学者面对的一大学习障碍。然而,在初级阶段的渲染学习中,我们需要掌握的数学理论实际并不复杂。本章将为读者讲解渲染过程中常见的数学知识,如矢量、矩阵运算、坐标空间等。本章内容可以大大帮助读者理解Shader中的数学运算。为了帮助读者加深理解,我们在讲解过程中以一个具体的例子来阐述“一头奶牛的鼻子是如何一步步被绘制到屏幕上的”。

在学习完基础篇后,我们就正式开始了Unity Shader的学习之旅。初级篇将会从最简单的Shader开始,讲解Shader中基础的光照模型、纹理和透明效果等初级渲染效果。需要注意的是,我们在初级篇中实现的Unity Shader大多不能直接用于真实项目中,因为它们缺少了完整的光照计算,例如阴影、光照衰减等,仅仅是为了阐述一些实现原理。在第9章最后,我们会给出包括了完整光照计算的Unity Shader。初级篇包含了以下4个章节。

第5章开始Unity Shader学习之旅本章将实现一个简单的顶点/片元着色器,并详细解释其中每个步骤的原理,这需要读者对之前基础篇的内容有所理解。本章还会给出关于Unity Shader的一些常用的辅助技巧,例如如何调试、查看内置代码以及编写规范等。

第6章 Unity中的基础光照 本章将学习如何在Shader中实现基本的光照模型,如漫反射、高光反射等。我们首先解释如何从无到有实现一个光照模型,最后给出使用Unity提供的内置函数来实现的版本。

第 7 章基础纹理 纹理的使用给渲染的世界带来了更多的变化。这一章将会讲述如何在Unity Shader中使用法线纹理、遮罩纹理等基础纹理。

第8章透明效果 透明是游戏中常用的渲染效果。这一章首先介绍了渲染的实现原理,并给出了和Unity的渲染顺序相关的重要内容。在了解了这些内容的基础上,我们将学习如何实现透明度测试和透明度混合等透明效果。

中级篇是本书的进阶篇章,主要讲解Unity中的渲染路径、如何计算光照衰减和阴影、如何使用高级纹理和动画等一系列进阶内容。中级篇包含了以下3个章节。

第9章更复杂的光照 我们在初级篇中实现的光照模型没有考虑一些重要的光照计算,如阴影和光照衰减。本章首先讲解Unity中的3种渲染路径和3种重要的光源类型,再解释如何在前向渲染路径中实现包含了光照衰减、阴影等效果的完整的光照计算。在本章最后,我们会给出基于之前学习内容实现的包含了完整光照计算的Unity Shader。

第10章高级纹理 这一章将会讲解如何在Unity Shader中使用立方体纹理、渲染纹理和程序纹理等高级纹理。

第11章让画面动起来 静态的画面往往是无趣的。这一章将帮助读者学习如何在Shader中使用时间变量来实现纹理动画、顶点动画等动态效果。

高级篇涵盖了一些Shader的高级用法,例如如何实现屏幕特效、利用法线和深度缓冲以及非真实感渲染等,同时,我们还会介绍一些针对移动平台的优化技巧。高级篇的结构如下。

第12章屏幕后处理效果 屏幕特效是游戏中常用的渲染手法之一。这一章将介绍如何在Unity中实现一个基本的屏幕后处理脚本系统,并给出一些基本的屏幕特效的实现原理,如高斯模糊、边缘检测等。

第13章使用深度和法线纹理 使用深度和法线纹理可以帮助我们实现很多屏幕特效。本章将介绍如何在Unity中获取这些特殊的纹理来实现屏幕特效。

第14章非真实感渲染 很多游戏使用了非真实感渲染的方法来渲染游戏画面。这一章将会给出常见的非真实感渲染的算法,如卡通渲染、素描风格的渲染等。本章的扩展阅读部分可以帮助读者找到更多其他类型的非真实感渲染的实现方法。

第15章使用噪声 很多时候噪声是我们的救星。本章给出了噪声在游戏渲染中的一些应用。

第16章 Unity中的渲染优化技术 优化往往是游戏渲染中的重点。这一章介绍了Unity中针对移动平台使用的常见的优化技巧。

扩展篇旨在进一步扩展读者的视野。本篇将会介绍Unity的表面着色器的实现机制,并介绍基于物理的渲染的相关内容。最后,我们给出了更多的关于学习渲染的资料。扩展篇包含了以下4个章节。

第17章Unity的表面着色器探秘 Unity提出了一种新颖的Shader形式——表面着色器。本章将会介绍这些表面着色器是如何实现的,以及如何使用这些表面着色器来实现渲染。

第18章基于物理的渲染 Unity 5终于引入了基于物理的渲染,这给Unity引擎带来了更强的渲染能力。这一章将介绍基于物理渲染的理论基础,并解释Unity是如何实现基于物理的渲染的。我们还会在本章实现一个基本的场景来进一步阐述如何在Unity 5中利用基于物理的渲染。

第19章Unity 5更新了什么 相较于Unity 4.x,Unity 5在Shader方面有很多重要的更新。本章将给出Unity 5中一些重要的更新,以帮助读者解决在升级Unity 5时所面对的各种问题。

第20章还有更多内容吗 图形学的丰富多彩远远超乎我们的想象,我们相信一本书也远远无法满足一些读者强烈的求知欲。在最后一章中,我们将给出许多非常有价值的学习资料,以帮助读者进行更深入的学习。

那么,你准备好了吗?和我们一起进入Shader的世界吧!


相关图书

Unity游戏开发入门经典(第4版)
Unity游戏开发入门经典(第4版)
Unity  3D游戏开发技术详解与典型案例
Unity 3D游戏开发技术详解与典型案例
从零开始:快速入门Unity 3D游戏开发
从零开始:快速入门Unity 3D游戏开发
Unity 3D脚本编程与游戏开发
Unity 3D脚本编程与游戏开发
AR开发权威指南:基于AR Foundation
AR开发权威指南:基于AR Foundation
VR与AR开发高级教程:基于Unity(第2版)
VR与AR开发高级教程:基于Unity(第2版)

相关文章

相关课程