《Unity Universal RP 内置Shader解析》简介
写作背景2020年5月,公司启动了基于Unity引擎开发的的3D汽车展示项目,旨在使用户能够在手机上通过3D的方式查看市面上的所有汽车。考虑到移动设备性能方面的问题,团队在技术路线上首选了Unity的Universal Render Pipeline。
随着功能开发逐渐推进,笔者也逐渐发现这样一个问题:虽然Unity的可编程渲染流水线已经推出了两年多了,但是其官方文档仍然没有补充完整,而仅有的几个文档也是点到即止,对于新手来说并不能起到很好的指导作用。网上零零散散有很多关于这方面的分享文章,而系统讲解Universal RP的至今没有发现,市面上更是没有一本关于这方面的书籍。
于是,笔者一边在网上查阅资料一边翻看shader的源码,然后在项目应用中不断测试并验证自己的假设,这一路走来,实属不易。想到肯定还有跟我同样的人正在或将要重走一遍这样的路,为了给他们提供些许帮助,笔者特地将自己的经验和成果总结下来,编辑成册。
虽然本书中仍然存在很多未研究透的知识点,但是读者读完本书之后,在Unity 的Universal RP项目中自己编写Shader已经完全不成问题。
本书介绍
本书是一部系统讲解Unity Universal Render Pipeline内置shader的应用型图书,旨在使读者能够了解URP与传统渲染流水线shader的不同之处,让读者尽快在URP项目中编写出所需的shader。
本书采用串联讲解的方式编写而成,主要分为三大部分:
第一部分包含第1章,主要为了给读者普及Universal RP的基本知识、项目的配置方法、内置shader的不同用途以及Package中不同包含文件的作用,使之前还没有接触过URP的读者在学习之前能够全方面的了解UPR。
第二部分包含第2章至第5章,主要讲解了URP中最复杂的内置shader——Lit,以及shader中关联到的包含文件、函数和宏定义。
第三部分包含第6章至第8章,讲解了Unity内置的可视化Shader编辑器Shader Graph,并讲解了车漆和流光灯两个Shader案例,用于巩固前面章节所学到的内容,并加深对于URP shader的理解。
使用群体
本书适合有Unity shader基础的读者作为自学、研究Universal RP的参考书,也适合目前使用传统渲染流水线做项目,打算往Universal RP转换的读者用于技术预研的教程书。
如果读者毫无Unity shader编写经验,建议先阅读笔者的第一本书《Unity ShaderLab 新手宝典》,这本书可以帮助你快速从“对Unity shader一无所知”的状态变成“完全掌握Unity shader”。
目录
第1章 初识Universal RP 1
1.1 URP与HDRP 1
1.2 创建URP项目 1
1.2.1 创建新URP项目 1
1.2.2 升级旧项目为URP项目 2
1.3 URP内置Shader 7
1.3.1 Lit 7
1.3.2 Simple Lit 8
1.3.3 Baked Lit 9
1.3.4 Unlit 10
1.4 手写shader的必要性 11
1.5 shader文件所在路径 11
1.6 Packages中的其他文件 12
1.6.1 Core RP Librariy 13
1.6.2 Universal RP 13
1.7 常用文件之间的包含关系 14
第2章 Lit.shader 16
2.1 Lit主文件 16
2.1.1 Properties代码块 16
2.1.2 SubShader代码块 18
2.1.3 FallBack 19
2.1.4 代码结构 20
2.2 ForwardLit Pass 20
2.2.1 Pass标签 20
2.2.2 编译指令 21
2.2.3 声明关键词 22
2.2.4 包含指令 26
2.3 包含文件的定义及使用 27
2.3.1 包含文件的定义方式 27
2.3.2 包含文件的使用方式 27
第3章 LitInput.hlsl 30
3.1 声明属性变量 30
3.2 纹理采样 32
3.2.1 采样函数的宏定义 32
3.2.2 金属和高光采样函数 33
3.2.3 AO采样函数 34
3.3 SurfaceInput.hlsl 35
3.3.1 SurfaceData结构体 36
3.3.2 透明度函数 36
3.3.3 Albedo纹理采样函数 37
3.3.4 法线贴图采样函数 38
3.3.5 自发光贴图采样函数 39
3.4 表面数据初始化函数 40
3.5 函数和宏定义总结 41
第4章 LitForwardPass.hlsl 43
4.1 GPU实例 43
4.2 结构体 45
4.2.1 顶点函数输入结构体 45
4.2.2 顶点函数输出结构体 46
4.3 Common.hlsl 49
4.3.1 规范 49
4.3.2 函数 53
4.4 输入数据初始化函数 53
4.4.1 Input.hlsl 53
4.4.2 初始化函数第1部分 54
4.4.3 SpaceTransforms.hlsl 57
4.4.4 初始化函数第2部分 59
4.5 顶点函数 61
4.5.1 顶点函数第1部分 61
4.5.2 顶点函数第2部分 62
4.5.3 顶点函数第3部分 64
4.5.4 顶点函数第4部分 67
4.6 片段函数 69
4.7 函数和宏定义总结 73
4.8 Unlit shader案例 74
4.8.1 完整shader代码 74
4.8.2 代码解析 76
第5章 其余四个Pass 77
5.1 ShadowCaster Pass 77
5.1.1 Pass代码块 77
5.1.2 ShadowCasterPass.hlsl 78
5.2 DepthOnly Pass 83
5.2.1 Pass代码块 83
5.2.2 DepthOnlyPass.hlsl 84
5.3 Meta Pass 85
5.3.1 Pass代码块 86
5.3.2 MetaPass.hlsl 87
5.4 Universal2D Pass 91
5.4.1 Pass代码块 91
5.4.2 Universal2D.hlsl 92
第6章 Shader Graph 94
6.1 Shader Graph介绍 94
6.2 使用流程 94
6.3 常用节点 95
6.3.1 数据输入类节点 96
6.3.2 数学计算类节点 98
6.3.3 向量处理类节点 104
6.3.4 视觉调整类节点 106
第7章 车漆Shader案例 109
7.1 设计逻辑 109
7.2 使用Shader Graph梳理逻辑 109
7.2.1 创建属性变量 110
7.2.2 Albedo部分节点 113
7.2.3 Occlusion部分节点 114
7.2.4 Clear Coat部分节点 115
7.2.5 Flake部分节点 116
7.2.6 Specular、Smoothness部分节点 118
7.2.7 完整节点连接 119
7.3 测试Shader效果 119
7.4 编写车漆Shader代码 120
7.4.1 CarPaint.shader文件 120
7.4.2 CarPaintInput.hlsl文件 124
7.4.3 CarPaintForwardPass.hlsl文件 127
第8章 流光灯特效Shader案例 133
8.1 效果分析 133
8.2 使用Shader Graph梳理逻辑 134
8.2.1 开放属性变量 134
8.2.2 Albedo和Normal部分节点 135
8.2.3 Metallic和Smoothness部分节点 136
8.2.4 灯光部分节点连接 136
8.2.5 完整节点连接 138
8.3 编写流光灯Shader代码 139
8.3.1 FlowingLight.shader文件 139
8.3.2 FlowingLightInput.hlsl文件 141
8.3.3 FlowingLightForwardPass.hlsl文件 144
写在最后 148
参考文献 149本书应该如何阅读
本书按照笔者研究源码的思路进行编写的,引导读者从一个内置的Shader(Lit shader)开始逐步了解Universal RP项目中完整的Shader框架,所以强烈建议读者在阅读本书的时候能够坐在电脑前,启动Unity,按照书中的引导打开并阅读源码。
Unity为了实现模块化将Shader按照不同功能拆分成不同的文件,然后以包含文件的形式进行整合,因此在阅读源码的过程中需要来回翻阅多个不同的文件,所以建议读者一次性阅读尽可能多的篇幅,切勿在中间章节停下,否则前面讲解的内容很可能会遗忘。
某些shader文件的代码量非常大,读者在阅读后面的代码很容易就会忘记前面的代码,因此建议读者在阅读源代码的过程中养成添加注释的习惯。 出来没呀? 支持支持 在哪里能买啊!? 已经印刷完了,这几天准备做推广活动,下个月会正式上市,谢谢期待 现在还不能买,下个月估计就可以了。不过我本周准备做粉丝答谢活动,会有十几本可以赠送,欢迎到时参加 感谢支持 又推到了十一月[捂脸] 钱拿去[飙泪笑] 周末参加我的粉丝答谢活动吧