Shader学习路线
核心学习理念
循序渐进:不要试图一口吃成胖子。从实现小效果开始,逐步积累。
理论与实践结合:看懂后一定要亲手敲一遍代码,改参数,看变化。
模仿与创新:先模仿经典效果(漫反射、高光、透明),再尝试组合和创新。
调试是关键:学会用
return float4(1,0,0,1);
这种方式来调试和可视化中间数据。
学习路线图 (四个阶段)
阶段一:基础概念与快速入门 (1-2周)
目标:建立核心概念,能在 Unity 里运行起第一个 Shader,了解基本的工作流。
核心概念扫盲:
渲染管线:了解顶点着色器和片元着色器在哪个阶段工作,数据是如何流动的。不用深究细节,知道流程即可。
数学基础:重点是 向量(点积、叉积)、矩阵(矩阵乘法、空间变换)、坐标空间(模型、世界、视图、裁剪、屏幕空间)。不需要成为数学家,但要明白这些计算在图形学中的意义(例如,点乘用于计算夹角、光照)。
HLSL 语法:了解基本的数据类型(
float
,half
,fixed
,float2/3/4
,sampler2D
)、结构体、函数写法。
Unity 工具初探:
ShaderLab:了解
.shader
文件的基本结构(Properties
,SubShader
,Pass
)。创建第一个 Unlit Shader:写一个只输出纯色或简单纹理的 Shader。这是你的 "Hello World!"。
表面着色器(Surface Shader):作为 Unity 开发者,这是你最快出效果的途径。学习它的结构,理解
surf
函数如何输出表面参数,而光照部分由 Unity 帮你处理。用它实现一个标准的漫反射 + 高光材质。
关键技能:
学会在 Properties 块中定义属性,并在 Shader 中访问它们。
学会使用
tex2D
函数进行纹理采样,并应用 UV 偏移和缩放 (_MainTex_ST
)。学会将 Shader 赋给 Material,并在 Inspector 中调节参数。
产出:你能创建一个受光影响的材质球,并能通过纹理和颜色来控制它的外观。
阶段二:深入核心与自定义光照 (2-3周)
目标:脱离表面着色器的“舒适区”,理解底层实现,掌握手写顶点/片元着色器的能力。
手写 Vertex & Fragment Shader:
自己编写
vert
和frag
函数。必备技能:掌握顶点变换
UnityObjectToClipPos(v.vertex)
。学会在顶点着色器和片元着色器之间传递数据(通过结构体),理解插值的概念。
实现自定义光照模型:
Lambert (漫反射):
diffuse = max(0, dot(N, L)) * _LightColor0;
这是理解光照的基础。Blinn-Phong (高光反射):
specular = pow(max(0, dot(N, H)), _Gloss) * _LightColor0;
理解半角向量H
。在前向渲染路径中,学会处理多个光源(
ForwardBase
和ForwardAdd
Pass)。这是难点,但非常重要。
常用特效入门:
透明度处理:
Alpha Test
(clip
函数) vsAlpha Blending
(Blend
命令,Queue
设置为Transparent
)。顶点动画:在顶点着色器中偏移顶点位置(如模拟旗帜飘动、草摆动)。
溶解效果:利用
clip
和噪声图。扭曲效果:扰动 UV 来采样 GrabPass 或屏幕纹理。
产出:你能不依赖 Surface Shader,手动实现一个包含漫反射、高光,并且能正确接收多个点光源的自定义 Shader。
阶段三:高级技术与性能优化 (2-4周+)
目标:学习现代游戏中常用的高级技术,并开始关注 Shader 的性能和兼容性。
高级纹理技术:
法线贴图:理解切线空间,学会使用
UnpackNormal
和TransformTangentToWorld
。遮罩图:用一张纹理的 R、G、B、A 通道分别控制不同属性(如金属度、光滑度、AO、自发光)。
程序化纹理:在 Shader 中用代码(如噪声函数)生成纹理,减少贴图依赖。
渲染纹理与屏幕后处理:
理解
GrabPass
或命令CommandBuffer
获取屏幕内容。编写一个屏幕后处理 Shader(必须继承自
PostProcessEffectRenderer
或在 URP 中使用RenderPass
)。实现常见屏幕特效:模糊、Bloom、颜色校正、景深等。
性能优化专题:
Shader 变体:深刻理解
#pragma multi_compile
和#pragma shader_feature
,学会用shader_feature
减少不必要的变体,控制包体大小。精确数据类型:在移动平台,对颜色用
fixed
,对方向和向量用half
,对位置和坐标用float
。减少计算和采样:合并计算,利用 UV 动画代替纹理采样,使用纹理图集。
了解带宽瓶颈:压缩纹理,减少纹理尺寸。
利用 SRP Batcher (URP/HDRP):编写兼容的 Shader,减少 SetPass Call。
产出:你能制作使用法线贴图、遮罩图的高质量材质,能编写常见的屏幕后处理效果,并能为不同平台编写性能良好的 Shader。
阶段四:精通与特定领域深化 (持续学习)
目标:根据你的项目需求,深入研究特定方向的 Shader 开发。
风格化渲染 (非真实感渲染 NPR):
卡通着色:实现色块化漫反射 (
smoothstep
)、边缘光(菲涅尔边缘)。水彩/油画风格:基于图像处理的后处理效果。
高级物理渲染 (PBR):
深入研究 Unity 的
Standard
Shader 或 URP 的Lit
Shader 源码。理解 BRDF 方程、能量守恒、菲涅尔方程、法线分布函数等概念。
Shader Graph 精通:
虽然它是可视化工具,但精通它需要理解阶段二和阶段三的概念。
学习创建自定义节点(用 HLSL 代码),将 Shader Graph 和手写代码的优势结合。
Compute Shader:
这不是用于渲染,而是用于通用 GPU 计算。可以用来处理大规模粒子系统、复杂算法(如网格变形、剔除、AI),极大提升性能。
产出:你能成为团队中的图形技术专家,负责攻克特定的渲染难题和性能瓶颈。
推荐资源
书籍:
《Unity Shader 入门精要》(冯乐乐):中文必读经典,完美契合这条学习路线。
《Unity 3D ShaderLab 开发实战详解》
网站/教程:
Catlike Coding Rendering Tutorials:神级教程,跟着做一遍,水平飙升。
Unity Manual (Graphics):官方文档永远是最好的参考。
Brackeys(YouTube):有很多直观有趣的 Shader 教程。
工具:
Shader Graph (URP/HDRP):可视化,快速原型制作。
RenderDoc:图形调试器,查看每一帧的绘制过程和中间缓冲区的值。
Frame Debugger:Unity 内置,查看每一帧的 Draw Call。
总结
| 阶段 | 重点 | 产出 |
| :--- | :--- | :--- |
| 一:基础 | 概念、工具、Surface Shader | 标准受光材质 |
| 二:核心 | Vert/Frag Shader、自定义光照 | 手写多光源 Shader、简单特效 |
| 三:高级 | 法线贴图、屏幕特效、性能优化 | 高质量材质、后处理、优化意识 |
| 四:精通 | NPR、PBR、Compute Shader | 图形技术专家 |