本站支持尊重有效期内的版权/著作权,所有的资源均来自于互联网网友分享或网盘资源,一旦发现资源涉及侵权,将立即删除。希望所有用户一同监督并反馈问题,如有侵权请联系站长或发送邮件到ebook666@outlook.com,本站将立马改正
本书是一部系统讲解Unity ShaderLab语言与编程方法的入门教程(包含纸质图书、Unity美术资源、Shader源代码)。
本书共分14章,□□、□章,主要为了给读者普及3D数学相关的基础知识以及GPU渲染流水线的基本概念,为本书后面的内容提供基础知识的储备。第3~11章,主要讲解了Shader的语法结构、两种不同的编写方式(Vertex Fragment Shader和Surface Shader)、光照模型、后期处理、自定义材质设置面板。这一部分内容是本书的主要部分,读者朋友们一定要认真阅读。□□□章,主要讲解Unity Shader可视化编辑插件——Amplify Shader Editor,方便读者在编写Shader之前梳理逻辑或者前期验证效果的时候使用。□□3、14章,通过对不同经典案例的分析和讲解,使读者进一步加深对Unity Shader的理解,并且能够更加高效地编写出可以应用于真实项目的Shader效果。
本书主要以3D美术人员的视角进行效果描述和逻辑讲解的,因此非常适合毫无程序编写经验的3D美术人员作为Unity Shader的入门之选。并且本书同样也适用于各大培训机构、高等院校作为Unity Shader课程教材使用。
当然,从事Unity程序开发的朋友也可以阅读本书,从3D 美术人员的视角开始切入,或许可以帮助你更好的理解Unity Shader,毕竟Shader也是一种视觉效果的设计。
前言
本书的写作背景
相信很多人在玩游戏的过程中,在体验游戏剧情的同时,也会被游戏中精美的画面所吸引。因此我猜想,肯定会有很多人跟我一样,有一种想要制作一款画质精美的游戏的冲动。然而想要实现精美画质的视觉效果,往往需要编写多种多样的Shader。但对于一些毫无编程经验的人来说,想要入门Unity Shader比较困难。这是因为,一方面国内关于Unity Shader的书少之又少,而目前市面仅有的几本也是针对Unity 5版本编写的,并不完全适用于Unity □019版; 另一方面网上关于Unity Shader的教程,很多都是一上来直接讲代码,很少有真正从基础开始讲解的。于是笔者萌生了一个念头: 写一本面向零基础Unity Shader爱好者的入门指南。
本书的独特之处
本书采用由易到难、层层深入的讲解方法,带领毫无Shader编程基础的读者逐渐掌握这门技术。对于一些理论性的知识和使用方法,本书不会灌入式地硬性讲解,而是会从内在逻辑开始讲起,从而使读者彻底理解。
为了方便读者理解Shader效果实现的内在逻辑,本书插入了大量流程图、汇总表格等。对于一些专有名词或者语法关键词,本书在编写的过程中使用了“中文+英文”的方式,方便读者理解以及后期查找或者阅读其他资料。
笔者一直认为,Shader的学习达到一定程度之后,其实就是在学习数学算法。Shader的程序代码本身并不重要,重要的是里边的逻辑和算法。很多人总是会好奇“这段代码为什么能够实现这样的效果”,相信这是学习Shader的人□想弄清楚的。而涉及逻辑类的数学思想有时候很难用文字表达出来,所以本人在案例讲解部分会借助可视化Shader编辑器“Amplify Shader Editor”来帮助读者理解其中的内在逻辑。
需要提前掌握的知识
作为一本计算机图形专业书籍,建议读者在阅读本书之前掌握如下知识:
(1) Unity的基本操作,比如导入资源、创建对象、添加组件等。
(□) 平面数学。
(3) 空间几何基础。
(4) 三角函数。
(5) 基础编程知识,比如理解□量、函数、运算操作等。
本书的源文件
为了方便读者编写测试,本书会附赠课程所涉及的所有Shader文件以及项目资源,读者将Package文件导入Unity项目之后,在Assets/ Unity ShaderLab Tutorial路径下即可看到所有的资源。
特别鸣谢
在这里我要特别感谢我的未婚妻,正是在她的鼓励下,我才有了编写本书的动力。记得在正式开始撰写本书之前,当我一直在为后续的出版事宜发愁时,她告诉我: “先迈出□□步,后面自然会有路。”因此我把出版问题全部抛掷脑后,专心写完了这本书。同时,本书从编写到出版的整个过程也让我深刻认识到: 万事开头难,但只要克服恐惧,勇敢地迈出□□步并持之以恒,一切皆会水到渠成。后来,每当我遇到事情犹豫不前的时候,我总会想起这句话: “先迈出□□步,后面自然会有路。”
本书大部分配图是使用Edraw制作而成的,这款软件使得我在配图制作方面节省了大量的时间,因此本人对这款图例制作软件表示郑重的感谢。
本书能够顺利出版,还要感谢清华大学出版社, 在该出版社相关编辑的帮助下,本书得以顺利面世。
□后,本书若有疏漏和不足之处,恳请读者批评指正。
于广州
□0□0年7月
目录
□□章3D数学基础
1.1坐标与坐标系
1.1.1坐标及坐标系的概念
1.1.□3D中的坐标系
1.1.3左右手坐标系
1.□向量
1.□.1向量的几种表示方法
1.□.□向量的计算方法
1.□.3相反向量
1.□.4向量的模
1.□.5标准化向量
1.3向量运算
1.3.1向量的加法运算
1.3.□向量的减法运算
1.3.3向量的缩放
1.3.4向量的点积运算
1.3.5向量的叉积运算
1.3.6向量的运算法则
1.4矩阵
1.4.1矩阵的表示方法
1.4.□方阵和单位矩阵
1.4.3转置矩阵
1.5矩阵运算
1.5.1标量与矩阵相乘
1.5.□矩阵之间的乘法
1.5.3矩阵与向量相乘
1.5.4矩阵的运算法则
1.6使用矩阵进行□换
1.6.1矩阵□换向量的原理
1.6.□旋转矩阵
1.6.3缩放矩阵
1.6.4平移矩阵
1.7矩阵的深入讲解
1.7.1矩阵的行列式
1.7.□余子式和代数余子式
1.7.3通过代数余子式计算行列式
1.7.4逆矩阵
1.7.5正交矩阵
1.7.6逆矩阵的运算法则
第□章渲染流水线与Shader概念
□.1渲染流水线概念
□.□3D图形渲染完整流水线
□.3空间□换
□.3.1模型空间与世界空间
□.3.□摄像机空间
□.3.3裁切空间
□.3.4屏幕空间
□.3.5多个坐标空间存在的意义
□.4现代GPU渲染流水线
□.5Shader概念
□.5.1什么是Shader
□.5.□Shader和材质的关系与区别
第3章ShaderLab语法基础
3.1Shader的组织结构
3.□Shader的名称
3.3Properties
3.3.1数值类属性
3.3.□颜色和向量类属性
3.3.3纹理贴图类属性
3.3.4所有类型属性汇总
3.4SubShader
3.4.1SubShader的标签
3.4.□Pass的渲染状态
3.5Fallback
第4章顶点片段着色器基础
4.1Shader编码工具
4.□创建和使用Shader
4.3Shader的编写方式
4.4CG语法基础
4.4.1编译指令
4.4.□着色器函数
4.4.3语义
4.4.4在CG中调用属性□量
4.4.5结构体
第5章Unity的包含文件
5.1包含文件的使用语法
5.□UnityCG.cginc
5.□.1顶点着色器输入结构体
5.□.□顶点□换函数
5.□.3向量□换函数
5.□.4灯光辅助函数
5.□.5视角向量函数
5.□.6其他辅助函数和宏
5.3UnityShaderVariables.cginc
5.3.1空间□换矩阵
5.3.□时间□量
5.4其他包含文件
5.5使用包含文件简化Shader
第6章Shader中的光照模型
6.1Lambert光照模型
6.1.1Lambert光照模型理论
6.1.□在Shader中获取灯光□量
6.1.3基于Lambert光照模型的Shader
6.□CG标准库函数
6.3HalfLambert光照模型
6.4Phong光照模型
6.4.1Phong光照模型理论
6.4.□在Shader中获取环境光□量
6.4.3基于Phong光照模型的Shader
6.5逐像素光照
6.6BlinnPhong光照模型
6.6.1BlinnPhong光照模型理论
6.6.□BlinnPhong光照模型的Shader
6.7灯光阴影
6.7.1渲染路径
6.7.□Pass标签
6.7.3内置的multi_compile
6.7.4实现阴影效果
第7章透明效果
7.1不透明物体的渲染顺序
7.□透明物体的渲染顺序
7.3混合透明效果
7.3.1混合指令
7.3.□混合系数
7.3.3混合操作
7.3.4混合透明的使用方法
7.3.5混合透明效果
7.3.6半透明物体的双面渲染
7.4透明测试效果
7.4.1透明测试的使用方法
7.4.□透明测试效果
7.4.3透明测试抗锯齿
7.5模板测试
7.5.1模板测试的计算流程
7.5.□模板测试的使用语法
7.5.3比较方法
7.5.4模板操作
7.5.5延迟渲染路径中的模板测试
7.5.6模板测试透明效果
第8章表面着色器的基础概念
8.1为什么不先学习表面着色器
8.□表面着色器的组织结构
8.3编译指令中的可选参数
8.3.1透明效果相关指令
8.3.□阴影和细分相关指令
8.3.3代码生成选项
8.3.4其他选项
8.4表面函数的语法结构
8.4.1表面函数输入结构体
8.4.□表面函数输出结构体
第9章编写表面着色器
9.1□简单的表面着色器
9.□在表面着色器中使用法线贴图
9.3表面着色器中的其他函数
9.3.1顶点修改函数
9.3.□自定义光照函数
9.3.3□终颜色修改函数
9.4曲面细分函数
9.4.1固定数量的曲面细分
9.4.□基于边长的曲面细分
9.4.3视锥剔除曲面细分
9.4.4基于距离的曲面细分
9.4.5Phong曲面细分
9.5透明效果
9.5.1混合透明效果
9.5.□透明测试效果
□□0章Image Effect
10.1GrabPass
10.1.1语法结构
10.1.□GrabPass Shader
10.1.3测试效果
10.□C#基础语法
10.□.1C#脚本的基本结构
10.□.□Properties
10.□.3C#中的常用函数
10.□.4基于Shader资源创建材质
10.□.5通过脚本往Material中传递□量
10.□.6C#中的数学函数
10.□.7其他功能
10.3PostProcessing
10.3.1后期处理的工作流程
10.3.□后期处理Shader
10.3.3后期处理脚本
10.4后期处理堆栈
10.4.1安装Post Processing包
10.4.□设置Layer和Volume
10.4.3编写Shader
10.4.4编写C#脚本
□□1章自定义材质面板
11.1不同类型的DrawerClass
11.1.1Toggle
11.1.□Enum
11.1.3KeywordEnum
11.1.4在编译指令中定义关键词
11.1.5PowerSlider
11.1.6IntRange
11.□属性的特性和Drawer
11.3装饰性PropertyDrawer
11.3.1SpaceDecorator
11.3.□HeaderDecorator
11.4完整PropertyDrawer示例
□□□章Amplify Shader Editor
1□.1相同功能的其他插件
1□.1.1Shader Forge
1□.1.□Shader Graph
1□.□ASE的使用流程
1□.3Shader属性设置
1□.3.1General
1□.3.□Blend Mode
1□.3.3Stencil Buffer
1□.3.4Tessellation
1□.3.5Output
1□.4常用节点
1□.4.1常数和属性类节点
1□.4.□纹理和坐标类节点
1□.4.3数□□算类节点
1□.4.4向量运算相关节点
1□.4.5图像处理相关节点
1□.4.6摄像机和屏幕相关节点
1□.4.7顶点数据类节点
1□.4.8表面数据类节点
1□.4.9时间节点
1□.5使用ASE创建标准Shader
1□.5.1Albedo
1□.5.□Normal
1□.5.3Emission
1□.5.4Specular
1□.5.5Ambient Occlusion
1□.5.6Texture Coordinate
1□.5.7属性排序及□终效果
□□3章初级案例
13.1流光效果
13.1.1实现逻辑
13.1.□使用ASE实现效果
13.1.3测试Shader效果
13.1.4编写Shader
13.1.5使用扩展
13.□描边效果
13.□.1实现逻辑
13.□.□编写Shader
13.□.3效果测试
13.3遮挡半透效果
13.3.1实现逻辑
13.3.□编写Shader
13.3.3效果测试
13.4TriPlanar Mapping效果
13.4.1实现逻辑
13.4.□使用ASE实现效果
13.4.3编写Shader
13.4.4测试Shader效果
13.5MatCap效果
13.5.1实现逻辑
13.5.□使用ASE实现效果
13.5.3编写Shader
13.5.4测试Shader效果
13.6物体切割效果
13.6.1实现逻辑
13.6.□使用ASE实现效果
13.6.3C#脚本
13.6.4测试效果
13.6.5编写Shader
□□4章进阶案例
14.1消融效果
14.1.1实现逻辑
14.1.□资源准备
14.1.3使用ASE实现效果
14.1.4使用扩展
14.1.5编写Shader
14.□动态液体效果
14.□.1实现逻辑
14.□.□模型准备
14.□.3使用ASE实现效果
14.□.4测试Shader
14.□.5编写Shader
14.3Billboard效果
14.3.1实现逻辑
14.3.□使用ASE实现雪花效果
14.3.3测试Shader
14.3.4编写Shader
14.4序列帧动画
14.4.1实现逻辑
14.4.□使用ASE实现效果
14.4.3测试Shader
14.4.4编写Shader
14.5卡通风格效果
14.5.1资源准备
14.5.□使用ASE实现效果
14.5.3编写Shader
14.6夜视仪后期处理
14.6.1Shader讲解
14.6.□完整Shader代码
14.6.3C#脚本讲解
14.6.4完整脚本代码
14.6.5测试□终效果
14.6.6使用ASE编辑后期处理Shader
写在□后
参考文献
唐福幸 资深3D美术师,从事3D行业已有六年,先后在多家公司担任3D美术主管、3D技术美术师,擅长一切从零开始:开创团队、制定流程、人员培训、效果把控。乐于钻研技术,并与人沟通分享。能够熟练使用Maya、ZBrush、Substance Painter、Substance Designer、Unity、Unreal等30余款3D专业软件,目前在有车以后公司担任“高级技术美术师”。