我从2009年才开始接触三维图形程序的编程,当时是由于导师项目的需要,整个系统采用基于OpenGL底层搭建的三维程序框架,因此最开始使用的是OpenGL这种最基础的3D程序接口,着色器使用的也是与之相对应的GLSL。这种基于OpenGL底层的三维程序框架开发起来是比较痛苦的,因此在后面的开发中我们加入了OSG的部分开发包。OSG是一个基于OpenGL的三维渲染引擎,它最大的意义就是将3D场景定义为空间中一系列连续的对象,以便管理三维世界。正是由于这两年的项目经验使我获取了三维图形渲染方面的很多知识。
2012年入职以后我才开始接触Unity,从开始使用Unity就被它强大的渲染功能深深震撼了。的确,Unity是一个强大的游戏开发工具,它使我们能够创建出令人惊叹的游戏特效和高质量的AAA级游戏,尽管相比老牌的Unreal、Cry等引擎,部分功能还处于不稳定的阶段。而作为一个强大的渲染引擎,着色器是三维游戏引擎中至关重要的一个因素,在游戏效果以及画面显示上起到决定性的作用。
Unity中的着色器并不是一门独特的语言,而是一种代码生成方式,且可简化低层次、复杂的着色器编程。目前国内市场上Unity3D着色器方面的书籍不多,而且介绍不专、不深,都是针对新手而写的入门级书籍。本书专注于Unity3D引擎的渲染方面,对Unity的着色器进行了深入讲解。对于想要学习Unity着色器的人来说,本书是一本不容错过的好书,它从最基础的着色器结构到着色器的创建,循序渐进地讲解着色器的各种知识,使读者能够逐渐掌握着色器语言。通过阅读本书,你将学到模拟人体皮肤的着色器、处理动态反射的着色器、三维场景中的渲染次序等,同时也将学习如何开发后期特效,如夜视、反射等。在每章的最后部分,还会对该章的知识进行一些补充,如介绍一些新的技术,包括如何提高着色器质量以及着色器的编写效率等。可以说,无论你是3D网络游戏的开发者、着色器编程渲染的发烧友、虚拟仿真的设计者,还是从事三维图形研究工作的研究人员,本书都是学习、开发和研究着色器的必备宝典!相信通过拜读此书,你必定会对着色器的强大渲染能力有更多惊奇的发现。
最后,我要感谢机械工业出版社不遗余力地引进国外优秀 IT 类书籍,感谢本书责任编辑陈佳媛给予我翻译本书的机会。感谢我的导师萨贤春教授,是他带领我走进了三维图形程序的世界,为以后Unity的学习打下了坚实的基础。感谢重庆煤科院应急救援所虚拟仿真培训实验室的杨俊燕博士,作为实验室主任,他指导我们完成了几个国家级或者院重点项目。正是因为这些项目,我逐渐积累了在Unity引擎、着色器、CG语言等方面的经验。在翻译过程中,我还得到了实验室多位同事的协助。特向以下协助翻译的同事表示大力感谢:刘雄、陈灿、李杜风、张咪咪、蒋旭刚、潘长松、王文海、杨发光。
由于时间仓促,译者虽已尽最大努力确保专业术语的统一和准确,也尽最大努力将原作者的意境用朴实的中文展现给读者,但由于水平和经验有限,书中的问题和疏漏之处在所难免,敬请读者朋友批评指正。
封面图
目录
- 译者序
- 前言
- 第1章漫反射着色1
- 1.1引言1
- 1.2创建基本的表面着色器2
- 1.2.1准备工作2
- 1.2.2如何操作2
- 1.2.3实现原理4
- 1.2.4参考5
- 1.3为表面着色器添加属性5
- 1.3.1如何操作5
- 1.3.2如何操作6
- 1.3.3参考7
- 1.4在表面着色器中使用属性7
- 1.4.1如何操作7
- 1.4.2实现原理9
- 1.5创建自定义漫反射光照模型9
- 1.5.1如何操作10
- 1.5.2实现原理10
- 1.5.3更多内容11
- 1.5.4参考12
- 1.6创建Half Lambert光照模型12
- 1.6.1如何操作12
- 1.6.2实现原理13
- 1.7创建渐变纹理来控制漫反射着色13
- 1.7.1准备工作14
- 1.7.2如何操作14
- 1.7.3实现原理14
- 1.8使用2D渐变纹理创建假的BRDF15
- 1.8.1准备工作15
- 1.8.2如何操作16
- 1.8.3实现原理17
- 1.8.4参考18
- 第2章使用纹理贴图制作特效19
- 2.1引言19
- 2.2通过修改UV坐标实现纹理贴图的滚动20
- 2.2.1准备工作20
- 2.2.2如何操作20
- 2.2.3实现原理21
- 2.3让精灵表单动起来22
- 2.3.1准备工作23
- 2.3.2如何操作23
- 2.3.3实现原理24
- 2.3.4更多内容25
- 2.3.5参考26
- 2.4压缩和混合纹理贴图26
- 2.4.1准备工作27
- 2.4.2如何操作28
- 2.4.3实现原理30
- 2.4.4参考31
- 2.5法线贴图31
- 2.5.1准备工作31
- 2.5.2如何操作32
- 2.5.3实现原理33
- 2.5.4更多内容33
- 2.6在Unity编辑器中创建程序纹理贴图34
- 2.6.1准备工作35
- 2.6.2如何操作35
- 2.6.3实现原理37
- 2.6.4更多内容38
- 2.7Photoshop色阶效果39
- 2.7.1准备工作39
- 2.7.2如何操作39
- 2.7.3实现原理41
- 2.7.4更多内容41
- 2.7.5参考41
- 第3章利用镜面反射让游戏闪耀起来42
- 3.1引言42
- 3.2利用Unity3D内置的高光类型 42
- 3.2.1准备工作43
- 3.2.2如何操作43
- 3.2.3实现原理44
- 3.3创建Phong高光类型45
- 3.3.1准备工作45
- 3.3.2如何操作45
- 3.3.3实现原理46
- 3.4创建BlinnPhong高光类型48
- 3.4.1准备工作48
- 3.4.2如何操作48
- 3.4.3实现原理49
- 3.5使用贴图对模型的高光进行遮罩50
- 3.5.1准备工作50
- 3.5.2如何操作51
- 3.5.3实现原理53
- 3.6金属与软高光54
- 3.6.1准备工作54
- 3.6.2如何操作55
- 3.6.3实现原理56
- 3.6.4参考58
- 3.7创建各向异性高光类型58
- 3.7.1准备工作59
- 3.7.2如何操作59
- 3.7.3实现原理61
- 第4章着色器的反射63
- 4.1在Unity3D中创建立方图63
- 4.1.1准备工作64
- 4.1.2如何操作65
- 4.1.3实现原理66
- 4.1.4参考67
- 4.2Unity3D中简单的立方图反射67
- 4.2.1准备工作68
- 4.2.2如何操作68
- 4.2.3实现原理70
- 4.3Unity3D中的遮罩反射70
- 4.3.1准备工作70
- 4.3.2如何操作71
- 4.3.3实现原理72
- 4.4Unity3D中的法线贴图和反射73
- 4.4.1准备工作73
- 4.4.2如何操作74
- 4.4.3实现原理75
- 4.4.4更多内容76
- 4.5Unity3D中的菲涅尔反射76
- 4.5.1准备工作77
- 4.5.2如何操作77
- 4.5.3实现原理79
- 4.6在Unity3D中创建简单的动态立方图系统79
- 4.6.1准备工作80
- 4.6.2如何操作80
- 4.6.3实现原理82
- 4.6.4更多内容82
- 第5章光照模型83
- 5.1引言83
- 5.2发光球体光照模型83
- 5.2.1准备工作84
- 5.2.2如何操作85
- 5.2.3实现原理86
- 5.2.4参考87
- 5.3漫反射卷积光照模型88
- 5.3.1准备工作88
- 5.3.2如何操作89
- 5.3.3实现原理91
- 5.3.4更多内容92
- 5.3.5参考92
- 5.4创建车辆喷漆的光照模型92
- 5.4.1准备工作93
- 5.4.2如何操作93
- 5.4.3实现原理95
- 5.4.4更多内容95
- 5.5皮肤着色器95
- 5.5.1准备工作96
- 5.5.2如何操作97
- 5.5.3实现原理99
- 5.5.4更多内容101
- 5.6布料着色器101
- 5.6.1准备工作102
- 5.6.2如何操作102
- 5.6.3实现原理104
- 第6章透明度106
- 6.1引言106
- 6.2使用alpha参数创建透明效果106
- 6.2.1准备工作106
- 6.2.2如何操作107
- 6.2.3实现原理108
- 6.3透明裁剪着色器108
- 6.3.1准备工作108
- 6.3.2如何操作109
- 6.3.3实现原理110
- 6.4通过渲染队列进行深度排序110
- 6.4.1准备工作110
- 6.4.2如何操作111
- 6.4.3实现原理111
- 6.5GUI和透明度112
- 6.5.1准备工作113
- 6.5.2如何操作114
- 6.5.3实现原理117
- 第7章顶点魔法118
- 7.1引言118
- 7.2在表面着色器中访问顶点颜色118
- 7.2.1准备工作119
- 7.2.2如何操作119
- 7.2.3实现原理121
- 7.2.4更多内容121
- 7.3表面着色器的顶点动画122
- 7.3.1准备工作122
- 7.3.2如何操作122
- 7.3.3实现原理124
- 7.4在地形中使用顶点颜色124
- 7.4.1准备工作125
- 7.4.2如何操作125
- 7.4.3实现原理127
- 第8章移动平台上着色器的优化128
- 8.1引言128
- 8.2什么是轻型着色器128
- 8.2.1准备工作129
- 8.2.2如何操作130
- 8.2.3实现原理132
- 8.3对着色器进行性能分析133
- 8.3.1准备工作133
- 8.3.2如何操作133
- 8.3.3实现原理137
- 8.3.4更多内容137
- 8.4移动平台上的着色器修改137
- 8.4.1准备工作137
- 8.4.2如何操作138
- 8.4.3实现原理139
- 第9章使用CgInclude文件让着色器模块化141
- 9.1引言141
- 9.2Unity中的内置CgInclude文件141
- 9.2.1准备工作142
- 9.2.2如何操作142
- 9.2.3实现原理143
- 9.3创建CgInclude文件来存储光照模型144
- 9.3.1准备工作144
- 9.3.2如何操作144
- 9.3.3实现原理146
- 9.4使用#define指令模块化地创建着色器147
- 9.4.1如何操作147
- 9.4.2实现原理149
- 第10章使用Unity的渲染纹理实现屏幕特效150
- 10.1引言150
- 10.2创建屏幕特效的脚本系统150
- 10.2.1准备工作151
- 10.2.2如何操作151
- 10.2.3实现原理155
- 10.2.4更多内容155
- 10.3使用屏幕特效实现亮度、饱和度以及对比度157
- 10.3.1准备工作158
- 10.3.2如何操作158
- 10.3.3实现原理161
- 10.4使用屏幕特效实现类似Photoshop的基本混合模式162
- 10.4.1准备工作162
- 10.4.2如何操作163
- 10.4.3实现原理165
- 10.4.4更多内容165
- 10.5使用屏幕特效实现叠加混合模式167
- 10.5.1准备工作167
- 10.5.2如何操作167
- 10.5.3实现原理169
- 第11章游戏的可玩性和屏幕特效170
- 11.1引言170
- 11.2创建老电影风格的屏幕特效170
- 11.2.1准备工作171
- 11.2.2如何操作173
- 11.2.3实现原理176
- 11.3创建夜视的屏幕特效178
- 11.3.1准备工作179
- 11.3.2如何操作181
- 11.3.3实现原理184
- 11.3.4参考185