franciscochonge 发表于 2021-11-22 17:15

《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文件的代码量非常大,读者在阅读后面的代码很容易就会忘记前面的代码,因此建议读者在阅读源代码的过程中养成添加注释的习惯。

Mecanim 发表于 2021-11-22 17:15

出来没呀?

fwalker 发表于 2021-11-22 17:15

支持支持

stonstad 发表于 2021-11-22 17:24

在哪里能买啊!?

c0d3n4m 发表于 2021-11-22 17:28

已经印刷完了,这几天准备做推广活动,下个月会正式上市,谢谢期待

LiteralliJeff 发表于 2021-11-22 17:36

现在还不能买,下个月估计就可以了。不过我本周准备做粉丝答谢活动,会有十几本可以赠送,欢迎到时参加

LiteralliJeff 发表于 2021-11-22 17:39

感谢支持

rustum 发表于 2021-11-22 17:44

又推到了十一月[捂脸]

JoshWindsor 发表于 2021-11-22 17:46

钱拿去[飙泪笑]

KaaPexei 发表于 2021-11-22 17:49

周末参加我的粉丝答谢活动吧
页: [1] 2 3
查看完整版本: 《Unity Universal RP 内置Shader解析》简介