GameTech/URP 渲染实战

Unity URP Shader 案例目录(234 个)

从第一个 URP Shader 到 PBR、卡通渲染、水、溶解、贴花、后处理。每个案例都有完整代码,配图可在浏览器里实时预览、调参数、改代码。

第 1 章 从像素说起:GPU 渲染管线与坐标空间

  1. 案例 1.1 坐标空间“调色板”:把各个空间画出来 入门写一个调试 Shader,把一个点在物体空间、世界空间、观察空间、NDC、裁剪空间 w、像素坐标下的值“涂”在物体表面上…
  2. 案例 1.2 法线可视化与非均匀缩放的坑 入门把物体空间、世界空间、观察空间的法线分别画出来;再用“正确”和“错误”两种方式变换法线并计算漫反射,对比非均匀缩放下的差…
  3. 案例 1.3 在裁剪空间里直接画:原始深度 vs 线性深度 进阶读取 URP 的相机深度纹理 _CameraDepthTexture,分别显示原始深度、Linear01Depth、Li…
  4. 案例 1.4 透视校正插值 vs 仿射插值 入门复现 1.7 节说的“仿射插值”,看看没有透视校正的纹理是什么样子。
  5. 案例 1.5 屏幕 UV:除法放在顶点还是片元 进阶搞清楚为什么 URP 的 positionNDC(以及旧的 ComputeScreenPos)返回的是“没除 w”的值,…

第 2 章 URP 架构与一帧的流程

  1. 案例 2.1 帧快照:一格一格看一帧怎么画出来 进阶写一个 Renderer Feature,在指定的 RenderPassEvent 时刻把相机颜色缓冲“拍”一张快照,等…
  2. 案例 2.2 Depth Texture 与 Opaque Texture 的开关 入门写一个极简水面,同时用到深度纹理(深浅颜色、岸边白沫)和不透明纹理(折射),然后分别关掉 URP Asset 里的两个开…
  3. 案例 2.3 同一场景:Forward vs Forward+ vs Deferred 入门用 24 盏彩色点光源照亮一块 16 米 × 16 米的地面和 15 个小球,依次切换三种渲染路径,直观对比。URP A…
  4. 案例 2.4 Forward 的每物体光源上限 入门仍用 Forward 路径,分别尝试“把上限提到 8”和“把地面拆成 12×12 块”,理解每物体上限的含义。
  5. 案例 2.5 同一个 Shader 的三个 Pass,谁会被画? 进阶写一个有三个 Pass 的 Shader:UniversalForward 做正常着色、一个不写 LightMode 的…
  6. 案例 2.6 兼容与不兼容 SRP Batcher 的 Shader 入门对比两个功能完全相同的 Shader,一个兼容 SRP Batcher,一个不兼容,并学会检查兼容性。
  7. 案例 2.7 第一人称手持物:清不清深度 入门用 Overlay 相机渲染一个“拿在手里”的物体,对比 Clear Depth 关闭和开启的效果。
  8. 案例 2.8 MSAA、Render Scale 与 HDR 的直观对比 入门在同一场景里只改 URP Asset 的一项设置,看清楚每个开关到底改变了什么。

第 3 章 第一个 URP Shader

  1. 案例 3.1 最小可运行:纯色 Unlit 入门写出能在 URP 下编译、把物体涂成一个纯色的 Shader,并看懂每一行。
  2. 案例 3.2 纹理采样与 Tiling/Offset 入门给物体贴一张图,并让材质面板上的 Tiling、Offset 生效。
  3. 案例 3.3 顶点色 入门读取网格自带的顶点色,与贴图和颜色相乘。顶点色是最便宜的“逐顶点数据通道”:美术可以在 DCC 软件里刷上 AO、渐变、…
  4. 案例 3.4 透明度裁剪 Alpha Clip 入门让贴图 alpha 低于阈值的像素“消失”,做出镂空的树叶、栅栏、铁丝网。
  5. 案例 3.5 接入雾效 入门让 Shader 响应 Window › Rendering › Lighting › Environment › Fo…
  6. 案例 3.6 兼容 SRP Batcher 入门把材质属性放进 UnityPerMaterial 常量缓冲区,让这个 Shader 能被 SRP Batcher 加速;…
  7. 案例 3.7 投射阴影与写入深度:ShadowCaster 与 DepthOnly 进阶让物体能投射阴影(包括镂空形状的阴影),并能出现在深度图 _CameraDepthTexture 里。
  8. 案例 3.8 关键字:用 multi_compile 与 shader_feature 做开关 进阶让顶点色、Alpha Clip、UV 来源都能在材质面板上开关,而且关掉的功能不产生任何运行时开销。
  9. 案例 3.9 迁移实战:把 Built-in 的滚动贴图 Shader 搬到 URP 进阶拿一个典型的 Built-in 管线 Unlit Shader(滚动贴图 + 顶点色 + 雾),逐行改成 URP 写法。…

第 4 章 Shader 里的数学工具箱与程序化图案

  1. 案例 4.1 在 Shader 里画函数曲线 入门写一个“示波器” Shader,把任意函数 y = f(x) 画成带网格和坐标轴的曲线。调参数学函数时,这比在脑子里想象…
  2. 案例 4.2 棋盘格、条纹与波点 入门用 4.3 节的“编号 + 局部坐标”结构做三种最常见的重复图案,并支持旋转和抗锯齿。
  3. 案例 4.3 圆形进度条与分段血条 进阶做两个游戏 UI 里最常见的程序化控件:带圆头和外发光的环形进度条;带受伤拖尾、分段刻度和低血量闪烁的血条。全部由材质参…
  4. 案例 4.4 极坐标图案:花瓣、螺旋与放射光 进阶在极坐标下画三个经典图案,并处理 atan2 接缝带来的抗锯齿问题。
  5. 案例 4.5 白噪声、Value、Gradient、Simplex 并排对比 进阶用同一个 Shader、同样的缩放,把四种噪声并排画出来,叠加整数格线,直观看到它们的区别。
  6. 案例 4.6 Voronoi 细胞 进阶生成 Voronoi(又称 Worley、细胞噪声)图案,分别展示“到最近点的距离”“细胞边界”和“按细胞上色的鹅卵石”…
  7. 案例 4.7 fBm 云纹 进阶用分形布朗运动(fractional Brownian motion,fBm)叠加多层噪声,做出一片有大轮廓也有小细节的…
  8. 案例 4.8 域扭曲:大理石与流体纹理 高阶用噪声扭曲噪声的输入坐标,从普通的 fBm 得到大理石、玛瑙、烟雾般的流动纹理。
  9. 案例 4.9 SDF 图标:定位图钉,带描边、发光与投影 进阶只用圆、圆角矩形和布尔运算拼出一个“定位图钉”图标,再用距离场一次性做出描边、外发光、内部明暗和软投影。
  10. 案例 4.10 Bayer 有序抖动 进阶只用两种(或少数几种)颜色表现连续的渐变,理解有序抖动(Ordered Dithering)的原理与 Bayer 矩阵的…

第 5 章 经典光照模型

  1. 案例 5.1 Lambert 漫反射 入门写出 URP 里最简单的“受光” Shader——主光源的 Lambert 漫反射加球谐环境光,并理解那个无处不在的 N…
  2. 案例 5.2 Half-Lambert:让暗部不再死黑 入门理解 Valve 在《半条命 2》中提出的 Half-Lambert 光照,用它让角色背光面保留形体。
  3. 案例 5.3 Wrap Lighting 与交界线染色 进阶用一个参数在 Lambert 和 Half-Lambert 之间连续过渡,并给出“能量守恒”版本;再利用 Wrap 多出…
  4. 案例 5.4 Phong 高光 入门实现 Bui Tuong Phong 在 1975 年提出的高光模型,理解反射向量、高光指数和它们的几何意义。
  5. 案例 5.5 Blinn-Phong 与半程向量 入门用半程向量 H 改写 Phong 高光,理解 Blinn-Phong 与 Phong 的形状差异,以及它为什么成了游戏引…
  6. 案例 5.6 高光指数的能量归一化 进阶理解为什么“调高高光指数,高光却变暗了”,推导 Phong 与 Blinn-Phong 的归一化系数,并在 URP 的 …
  7. 案例 5.7 粗糙漫反射:Oren-Nayar 与 Minnaert 进阶理解为什么月亮、陶土、粗布在正面光照下“不够立体”,实现 Oren-Nayar 定性模型(并推导出一个不含三角函数的版本…
  8. 案例 5.8 逐顶点与逐像素光照 入门把同一套 Blinn-Phong 分别放在顶点着色器和片元着色器里计算,直观看到 Gouraud 着色的问题,并知道它在…
  9. 案例 5.9 经典光照函数库与实验台 进阶把本章的模型整理成一个可复用的 HLSL 函数库,统一接口和约定;再做一个用关键字自由组合漫反射与高光的“实验台” Sh…

第 6 章 多光源与阴影

  1. 案例 6.1 多光源 Lambert:同时支持 Forward 与 Forward+ 入门在第 5 章 Lambert 的基础上加入附加光循环,写出一个在 Forward(含逐顶点模式)和 Forward+ 下…
  2. 案例 6.2 自己计算衰减:为什么一定要有平滑窗口 进阶不调用 GetAdditionalLight(),直接读取 URP 上传的光源数组,自己计算距离和角度衰减;对比平方反比…
  3. 案例 6.3 接收主光源阴影 入门让 Lambert Shader 接收主光源的实时阴影,支持单张阴影图、级联、屏幕空间阴影和三档软阴影,并支持材质级的“…
  4. 案例 6.4 手写 ShadowCaster Pass 进阶完整实现一个可复用的 ShadowCaster Pass,正确处理方向光与点光/聚光两种投射、深度与法线偏移、近平面压扁…
  5. 案例 6.5 阴影 Bias 调参对比 进阶亲眼看到粉刺、Peter-Panning 和法线偏移过度三种问题,掌握 Bias 的调参方法。
  6. 案例 6.6 级联阴影可视化 进阶写一个调试 Shader,按像素所在的级联染色,直观检查级联划分;再对比 1 个和 4 个级联的阴影精度。
  7. 案例 6.7 附加光阴影 进阶理解点光、聚光阴影的存储方式,让多光源 Shader 正确接收它们。
  8. 案例 6.8 DepthOnly 与 DepthNormals Pass 入门弄清这两个 Pass 什么时候被调用、缺了会怎样,并写出可复用的实现。
  9. 案例 6.9 ClassicLit:完整的 Blinn-Phong + 多光源 + 阴影 Shader 高阶把本章所有内容组装成一个可以直接用于项目的 Shader:归一化 Blinn-Phong、球谐环境光、主光源级联软阴影、…

第 7 章 法线贴图与视差

  1. 案例 7.1 TBN 可视化:检查切线对不对 入门把 T、B、N 以及“法线贴图扰动后的世界空间法线”分别输出成颜色。这是排查法线贴图问题的第一把工具——接缝处明暗跳变、…
  2. 案例 7.2 砖墙法线贴图 入门写一个标准的切线空间法线贴图 Shader,结构与 URP Lit 一致,并用开关对比“无法线贴图 / 强度 1 / 强…
  3. 案例 7.3 三种常见错误的实拍对比 入门把“手写 rgb*2−1”和“Y 方向用反”这两个最常见的错误放在同一张图里,记住它们的长相,以后一眼就能认出来。
  4. 案例 7.4 细节法线:四种混合方法对比 进阶同一组基础法线(砖墙)和细节法线(圆点),用四种方法混合,并分别看最终光照和切线空间结果。四个函数写在一个独立的 inc…
  5. 案例 7.5 从高度图实时求法线 进阶只有一张高度图,在 Shader 里求出法线,并与离线烘焙的法线贴图对比。
  6. 案例 7.6 没有切线的网格:在像素里构造 TBN 高阶网格没有 TANGENT 数据,仍然正确地使用切线空间法线贴图。
  7. 案例 7.7 在自写 Shader 中接入 URP 的单步视差 进阶写一个可以在“无视差 / 单步 / Steep / POM”之间切换的 Shader,先实现前两种。四种模式用 [Key…
  8. 案例 7.8 POM 砖墙:从单步到光线步进 高阶实现 Steep 与 POM,并做三组对比:四种模式、层数对台阶的影响、高度缩放对深度感的影响。Steep 的实现:
  9. 案例 7.9 POM 自阴影 高阶在案例 7.8 的基础上加入软自阴影,并把结果乘到主光的衰减上。

第 8 章 环境光、光照贴图与反射探针

  1. 案例 8.1 用 C# 构造环境光:Color、Gradient 与 Skybox 入门不经过 Lighting 窗口,直接用脚本构造三种来源的球谐环境光,对比它们对物体的影响。这也是在运行时自定义环境光(比…
  2. 案例 8.2 把球谐基函数“画”出来 入门写一个 Shader,把单位球的每个顶点沿径向推到 |Ylm(方向)| 处,正值涂暖色、负值涂冷色,得到球谐教科书上经典…
  3. 案例 8.3 每一阶 SH 贡献了什么 进阶用一个色彩强烈的环境(上方暖白、左侧红、右侧蓝、下方偏绿),分别只用 L0、L0+L1、完整三阶来渲染,看清每一阶的作用…
  4. 案例 8.4 9 个系数到底有多准 进阶选一个高对比度的“摄影棚”环境(深灰背景 + 两块强烈的柔光箱 + 一条暖色轮廓灯),用暴力积分算出真实的辐照度,与 S…
  5. 案例 8.5 动手烘焙:用 C# 算一张最简光照贴图 进阶光照贴图到底存了什么?与其看 Lighting 窗口里的结果,不如自己算一张。我们写一个只有几十行的“迷你烘焙器”:场景…
  6. 案例 8.6 粗糙度与 mip:两种映射的对比 入门写一个只输出间接高光的 Shader,分别用 URP 的曲线和线性映射对同一个环境做粗糙度扫描。
  7. 案例 8.7 自定义环境反射 Cubemap 进阶不用天空盒,而是用自己生成的 Cubemap 作为环境反射(例如产品展示用的“摄影棚”环境、黄昏的天空),并让环境光、背…
  8. 案例 8.8 盒体投影:让地板的倒影“贴”住墙 进阶搭一个 6 × 3 × 6 米的房间,墙上画网格和一条白色腰线,地板是半光滑的反射面,对比开关盒体投影的效果。
  9. 案例 8.9 GILit:自写 Shader 接入 SH、光照贴图与反射探针 高阶写出与 URP Lit 在间接光上完全一致的自写 Shader,并能拆分显示各个分量。完整代码如下(较长,后面分段讲解)…
  10. 案例 8.10 材质 AO 与 SSAO 进阶同一个场景(砖墙 + 白色方块 + 白色球),对比无 AO、只有材质 AO、材质 AO + SSAO 三种情况。为了让环…
  11. 案例 8.11 Matcap 与环境光照的对比 入门实现带透视修正的 Matcap,并通过移动相机说明它与真正的环境光照的本质区别。

第 9 章 PBR 理论

  1. 案例 9.1 BRDF 单项可视化 Shader 进阶写一个可以单独输出 D、G、F、镜面项、漫反射项或完整直接光照的 Shader,用一排粗糙度递增的球把每一项“拍”出来。…
  2. 案例 9.2 GGX、Beckmann 与 Blinn-Phong 的长尾 入门同一个 α,对比三种 NDF 在球面上的样子。
  3. 案例 9.3 看见 G:遮蔽主要发生在哪里 入门用案例 9.1 的 Shader 输出 G 项(_Mode = 1,高度相关形式),观察它随粗糙度的变化;再对比分离形式…
  4. 案例 9.4 菲涅尔:F0 扫描与掠射高光 入门先用 F(𝐧·𝐯) 看不同 F0 的“边…
  5. 案例 9.5 Lambert 与 Disney 漫反射对比 入门把灯放在相机正后方(𝐥=𝐯),这是 Disney 漫反射与 Lamber…
  6. 案例 9.6 镜面项与完整直接光的粗糙度扫描 进阶看完整的 Cook-Torrance 镜面项和“漫反射 + 镜面”的最终结果怎样随粗糙度变化,体会能量守恒。
  7. 案例 9.7 白炉测试:BRDF 到底守不守恒 高阶直接把方向反照率 R(𝐯) 画在球上,检验 BRDF 的能量是否守恒。
  8. 案例 9.8 同一个金球,两种工作流 入门用 URP 自带的 Lit 验证两种工作流在“合法”参数下完全等价,并展示镜面工作流独有的自由度。
  9. 案例 9.9 在 Gamma 空间算光照会怎样 入门两盏彩色方向光照一个白球,对比线性空间与 Gamma 空间的光照结果。
  10. 案例 9.10 HDR 截断 vs 色调映射 入门同一个强光场景(太阳强度 4.5、自发光强度 5),对比不做色调映射、Neutral、ACES 三种输出。

第 10 章 逐行读懂 URP Lit

  1. 案例 10.1 最小 Lit:自己喂数据给 UniversalFragmentPBR 进阶写一个只有一百多行的 Lit Shader:自己填 SurfaceData 和 InputData,直接调用 URP 的…
  2. 案例 10.2 URP 高光 vs 标准 GGX:并排看 进阶在同一个 Shader 里,用 URP 的 InitializeBRDFData + DirectBRDFSpecula…
  3. 案例 10.3 白炉测试:URP 的直接高光守恒吗 高阶用第 9 章案例 9.7 的方法,对 URP 的 DirectBRDFSpecular 做白炉测试(F0 = 1),与标…
  4. 案例 10.4 把 Lit 的光照拆成四项 进阶按 UniversalFragmentPBR 的流程重算一遍,但把直接漫反射、直接高光、间接漫反射、间接高光分开累加,可…
  5. 案例 10.5 Simple Lit 与 Lit 对比 入门同一个蓝色、同一组光滑度,看两种模型的差别。
  6. 案例 10.6 金属度 × 光滑度矩阵 入门用 URP Lit 拍一张 5×5 的参数矩阵,作为理解与调参的速查图。行:金属度 0、0.25、0.5、0.75、1(…

第 11 章 从零手写 PBR

  1. 案例 11.1 BRDF 四件套 进阶把 D、V、F 和 Lambert 写成四个独立的小函数,名字统一加 My 前缀,避免和 core 包 BSDF.hls…
  2. 案例 11.2 第一步:只有主光的最小 PBR 入门在加任何复杂功能之前,用最少的代码验证 BRDF 是对的。这个 Shader 只读主光方向和颜色,没有阴影、没有环境光、…
  3. 案例 11.3 Forward Pass:顶点、InputData 与片元 进阶写出 ForwardLit Pass 的顶点、片元函数,并理解为什么我们要填 URP 的 InputData 结构体。
  4. 案例 11.4 多光源与阴影:Forward 与 Forward+ 进阶在两种渲染路径下都正确遍历附加光,接收主光与附加光阴影。
  5. 案例 11.5 预滤波环境图与 mip 选择 进阶
  6. 案例 11.6 环境 BRDF:解析近似与程序生成的 DFG LUT 高阶实现 split-sum 的右半,给出两种方案,并量化它们的差异。
  7. 案例 11.7 多次散射能量补偿 高阶让粗糙金属不再“越粗糙越暗”,并用白炉测试验证。
  8. 案例 11.8 法线贴图、Mask Map 与自发光 入门把表面细节接进来,看每一张贴图贡献了什么。
  9. 案例 11.9 其余四个 Pass 进阶给 MyPBR 补齐投射阴影、深度预渲染、深度法线与烘焙用的 Pass,让它在 URP 的所有功能里都是“一等公民”。
  10. 案例 11.10 调试视图:把光照拆开看 入门写一个与 MyPBR 共用全部 HLSL 的调试 Shader,单独输出 BRDF 的每一项、光照的每一部分。

第 12 章 PBR 进阶材质

  1. 案例 12.1 本章的材质框架与基准 GGX 进阶写一个最小但完整的金属度工作流 Shader 作为“基准材质”,并把光源循环、顶点处理等公共代码拆成可复用的 inclu…
  2. 案例 12.2 金属漆:清漆 + 程序化金属片 进阶实现带能量衰减、能修正底层的清漆材质,底层加一层程序化的金属片(flake)让车漆“闪”起来;用白炉测试验证能量,并与 …
  3. 案例 12.3 拉丝金属与同心圆拉丝 进阶用各向异性 GGX 做出直线拉丝(纽结、圆环)和同心圆拉丝(锅底、旋钮),并处理各向异性下的环境反射。
  4. 案例 12.4 Kajiya-Kay 双高光头发 进阶在一个球形“发帽”上实现双高光头发,对比 Blinn-Phong、单条 KK、双条 KK,并展示偏移噪声的作用。
  5. 案例 12.5 丝绒:Charlie sheen 布料 进阶实现布料着色,对比“把布当塑料(GGX)”、Charlie sheen、Charlie + 次表面色三种做法,并加一层程…
  6. 案例 12.6 皮肤:Wrap 与程序生成的预积分 LUT 高阶在 C# 里数值积分生成预积分皮肤 LUT(同时提供编辑器菜单把它烘焙成贴图);Shader 里用屏幕空间导数估计曲率,…
  7. 案例 12.7 背光的树叶 进阶做一组双面的程序化树叶,对比无透射、均匀透射、按叶脉厚度透射三种情况。
  8. 案例 12.8 油膜与彩虹色 高阶用干涉反射率替换 GGX 里的 Schlick 菲涅尔,做出油膜效果;对比 3 波长、16 波长光谱积分,以及 core…
  9. 案例 12.9 材质展台与取舍 进阶把本章的材质放进同一个场景,检查它们在同一套光照下是否协调,并总结每种材质的代价与适用场合。

第 13 章 PBR 材质制作与校准

  1. 案例 13.1 程序化刷漆金属:一套参数生成三张贴图 进阶用 C# 从一组参数生成 Albedo、Mask、Normal 三张贴图,体会“各通道从同一份结构派生、彼此对得上”的制…
  2. 案例 13.2 写一个“PBR 校验”Shader 进阶写一个读取 URP Lit 材质属性的校验 Shader,按 PBR 原则把超出范围的像素用醒目的斜条纹标出来,并能一键…
  3. 案例 13.3 批量检查贴图导入设置 入门写一个编辑器菜单,按命名约定检查贴图的 sRGB 和 Normal Map 设置,并检查材质的法线槽里是否放了非法线贴图…
  4. 案例 13.4 砖墙 PBR 套图 入门用配套的 bricks 套图(Albedo、Normal、Mask、Height)在 URP Lit 中组装一面砖墙,观…

第 14 章 卡通渲染

  1. 案例 14.1 色阶化:从 Lambert 到 Ramp 入门把平滑的漫反射切成明暗两档(或多档),比较 step、smoothstep 和 Ramp 贴图三种做法。
  2. 案例 14.2 阴影色:不要只是“变暗” 入门理解为什么卡通渲染的暗部要用单独指定的颜色,而不是“固有色 × 系数”,并加上第二层阴影。
  3. 案例 14.3 边缘光:菲涅尔与屏幕空间深度 进阶实现三种边缘光——纯菲涅尔、只在受光侧出现的菲涅尔、屏幕空间等宽的深度边缘光,并比较它们的特点。
  4. 案例 14.4 风格化高光:圆斑、色块、方块 进阶把高光做成一块硬边色块,并通过平移、缩放、分裂、方形化来控制它的形状。
  5. 案例 14.5 裁剪空间等宽描边 进阶实现背面外扩描边,比较物体空间外扩与裁剪空间外扩的线宽差异,并理解为什么一个 Pass 用 SRPDefaultUnli…
  6. 案例 14.6 平滑法线烘焙工具 进阶解决硬边模型的描边断裂问题——写一个编辑器工具,把平滑后的法线烘焙进切线或顶点色;并在拍摄脚本里对程序化网格调用同一个烘…
  7. 案例 14.7 头发天使环 进阶做出二次元角色头顶那圈亮环(天使环,Angel Ring),比较写实的连续发丝高光与色阶化的天使环。
  8. 案例 14.8 程序生成脸部阈值图与 SDF 面部阴影 高阶在 C# 里程序生成一套“二值图 → SDF → 阈值图”的完整流程(用一条带鼻子凸起的解析曲线代替美术手绘),在 Sh…
  9. 案例 14.9 卡通化的接收阴影 进阶让物体接收的投影也符合卡通风格:硬边、使用阴影色,而且与自身的明暗交界协调。
  10. 案例 14.10 完整的 Toon Shader 高阶把本章的所有部件组装成一个可直接用于项目的卡通 Shader:两层阴影色或 Ramp 贴图、卡通化的接收阴影、风格化高光…

第 15 章 更多风格化(NPR)

  1. 案例 15.1 Gooch 冷暖着色 入门在技术插图风格里,让背光面依然清楚可读——不是变黑,而是变“冷”。
  2. 案例 15.2 素描排线(Hatching) 进阶用 TAM 把受光强度变成笔触疏密,支持物体 UV 与屏幕空间两种贴法,并可给纸面上色。
  3. 案例 15.3 半调网点(Halftone) 进阶模拟报纸和漫画印刷的网点效果:单色版用黑色圆点表现明暗,彩色版用 C、M、Y、K 四色网点叠印出彩色。
  4. 案例 15.4 水彩与纸张感 进阶在不做后处理的前提下,让物体看起来像是用水彩一层层罩染在纸上的。
  5. 案例 15.5 复古像素风:PS1 的顶点抖动与仿射贴图 进阶复刻初代 PlayStation 的画面特征:顶点在屏幕上一格一格地跳、地面贴图随视角扭曲、贴图是硬边的大像素、颜色有明…
  6. 案例 15.6 Matcap 风格化 入门用一张“材质球照片”决定物体的全部外观;程序化生成几种风格的 Matcap,并修正 Matcap 在画面边缘的透视畸变。
  7. 案例 15.7 低多边形 flat shading:用 ddx/ddy 求面法线 入门不修改网格,让光滑物体呈现出“一面一色”的低多边形(Low Poly)风格。
  8. 案例 15.8 重心坐标线框与全息效果 进阶在不使用几何着色器的前提下画出恒定像素宽度的三角形线框,支持隐藏四边形对角线,并做成发光的全息风格。

第 16 章 透明、混合与模板测试

  1. 案例 16.1 混合模式大比拼 入门用一个 Shader 切出六种常见混合模式,在同一个背景(上半黑→白渐变、下半色相条)上叠三张红绿蓝圆盘,直观对比。
  2. 案例 16.2 ZTest / ZWrite / Cull 实验台 入门把三个状态都做成材质属性,在“一面墙挡住一个纽结”的场景里观察不同组合。
  3. 案例 16.3 透明排序问题与双 Pass 预深度 进阶复现半透明物体最常见的两类排序错误,并用“先写深度、再画颜色”的双 Pass 解决自身穿插问题。
  4. 案例 16.4 Alpha Clip 与 Alpha to Coverage 进阶比较铁丝网这类“细镂空”材质的三种做法,理解 Alpha to Coverage 的原理以及 alpha 锐化。
  5. 案例 16.5 抖动透明(Dither) 入门让物体“半透明”却不进透明队列——依然写深度、依然投影、完全不用排序。
  6. 案例 16.6 双面材质 入门让只有一层面的网格(树叶、纸片、旗帜、布料、开口的碗)正反两面都正确受光,并能给背面不同的颜色。
  7. 案例 16.7 X 光透视:被遮挡的部分显示剪影 进阶角色走到墙后时,被墙挡住的部分显示为发光的剪影,而角色自身可见的部分不受影响。
  8. 案例 16.8 传送门 / 窗口 进阶一扇门框里能看到另一个世界——紫色天幕、青色地面和几个物体,它们只在门框范围内可见;从侧面看,门里的世界依然在“门后”。
  9. 案例 16.9 用 RenderObjects 显示被遮挡部分的轮廓色 进阶不修改角色的任何材质和 Shader(角色用的是 URP 自带的 Lit),只通过 URP 自带的 Render Obj…

第 17 章 顶点动画

  1. 案例 17.1 旗帜飘动 入门一面固定在旗杆上的旗子,波浪从旗杆向外传播,越靠外摆幅越大,并叠加噪声制造阵风般的不规则起伏;正确重算法线。
  2. 案例 17.2 阴影 Pass 同步顶点偏移 入门直观看到“只在颜色 Pass 里做顶点动画”的后果,理解为什么必须在 ShadowCaster、DepthOnly 中做…
  3. 案例 17.3 草地风动 进阶一大片草(6 万根,合并成一个网格)在世界空间风场中起伏:成片的阵风扫过草地,每根草又各有细小的摆动;根部不动、越往上越…
  4. 案例 17.4 Gerstner 波 高阶用 Gerstner 波叠加出尖峰平谷的海面,法线用解析偏导数精确计算,并用雅可比行列式在波峰挤压处生成泡沫。
  5. 案例 17.5 膨胀与呼吸 入门让物体整体膨胀收缩(呼吸、心跳、充气),以及一道从下往上传播的“脉冲”;理解硬边模型膨胀时的裂缝问题。
  6. 案例 17.6 碎裂与吸附重组 进阶物体沿某个方向逐渐碎成三角形碎片:碎片绕自身中心旋转、沿面法线飞出、受“重力”下落并缩小,刚脱落时发出橙色辉光;把进度反…
  7. 案例 17.7 VAT:顶点动画贴图 高阶把一段“任意复杂”的逐顶点动画烘焙进两张贴图,运行时由 Shader 回放;同一份数据可以被多个实例以不同的帧偏移播放。

第 18 章 溶解、全息与护盾

  1. 案例 18.1 噪声溶解:用 clip 挖洞 入门给物体一个 0~1 的进度参数,进度增加时物体表面按噪声图案一块块消失,并且它投在地上的影子同步“溶掉”。
  2. 案例 18.2 边缘发光:让溶解有“燃烧”的前沿 入门在溶解的前沿加一条发光的边,可以是纯色硬边(科幻风格的“数字化消散”),也可以是从暗红到亮黄的渐变火边(燃烧)。
  3. 案例 18.3 方向溶解与球形溶解 进阶让溶解有方向感——比如角色从头到脚被“传送”走;或者从一个点向外扩散——比如被魔法击中的位置先开始瓦解。
  4. 案例 18.4 菲涅尔边缘光 入门让物体轮廓处出现一圈亮边。这是“被选中高亮”“能量体”“背光轮廓”最常用的手法,也是本章后面全息、护盾、冰面的组成部分。
  5. 案例 18.5 全息投影:扫描线、闪烁、故障与色差 进阶做一个科幻风格的全息投影:半透明发光的“光壳”,表面有横向扫描线,有一条亮带缓慢扫过,偶尔闪烁、偶尔横向错位(故障),轮…
  6. 案例 18.6 能量护盾(上):深度交接高亮 进阶一个半球形能量护盾罩在地面上,护盾与地面、与穿过它的物体相交的地方出现一圈亮线,就像能量场被“挤压”一样。
  7. 案例 18.7 能量护盾(下):六边形网格与受击涟漪 高阶给护盾加上蜂窝状六边形网格,每个格子有自己的明暗呼吸;被击中时,从命中点扩散出一圈光环,光环经过的格子被点亮,护盾表面同…
  8. 案例 18.8 扭曲隐身:采样不透明纹理 进阶光学迷彩。物体几乎透明,但它会把身后的画面轻微“弯折”,轮廓处还有一圈淡淡的亮边,运动时有热浪一样的抖动。
  9. 案例 18.9 冰冻覆盖:世界空间自上而下结冰 进阶一个参数 _Freeze 从 0 到 1,物体从朝上的表面开始结冰,逐渐蔓延到侧面、底面;冰层有厚度、有裂纹、边缘泛蓝白…
  10. 案例 18.10 X 光扫描线 进阶一道水平光带从下往上扫过场景里的物体,光带下方紧跟着一段“X 光”样式的拖尾:暗色底、亮轮廓、世界空间网格线;拖尾之后物…

第 19 章 水

  1. 案例 19.1 搭场景:一个有深有浅的水池 入门准备一个能“考验”水面的场景,并放上最朴素的水:一块单色半透明平面。
  2. 案例 19.2 深度着色:深的地方更深 入门让水的颜色和透明度随水深变化:浅处清澈泛青,深处浓重发蓝;岸边水深趋于 0 时平滑过渡,不出现硬边。
  3. 案例 19.3 折射与吸收 进阶水底的画面被水面的起伏弯折;光在水里按颜色被吸收,深处偏蓝绿;同时解决折射最常见的瑕疵——水面上方的物体“漏”进水里。
  4. 案例 19.4 双法线流动 进阶用法线贴图给水面加上细碎的波纹,并让波纹“流动”起来,同时避免一眼就能看出的重复平铺。
  5. 案例 19.5 菲涅尔与天空反射 进阶水面反射天空;低头看时几乎透明,看向远处时像镜子。
  6. 案例 19.6 太阳高光 入门太阳在水面上拉出一条闪烁的亮带(日光路径),被柱子挡住的地方没有高光。
  7. 案例 19.7 岸边泡沫 进阶岸线、礁石和柱子周围出现白色泡沫:贴岸的一条不规则实心带,外面还有一圈圈向岸边推进的细泡沫线。
  8. 案例 19.8 焦散:程序化 Voronoi 投射到水下 高阶水底出现游动的亮纹网;只出现在水下、只出现在朝上的面上、深处逐渐消失、柱子的阴影里没有;亮纹边缘带一点彩虹色的色散。
  9. 案例 19.9 Gerstner 波 进阶让水面真正起伏,有波峰波谷,并且波峰比波谷尖——这是 Gerstner 波和简单正弦波最明显的区别。
  10. 案例 19.10 平面反射:C# 反射相机 + RenderTexture 高阶水面倒映出岸上的柱子、石头和木栈道,而不只是天空。

第 20 章 地形与植被

  1. 案例 20.1 世界空间 UV 与陡坡拉伸 入门理解为什么地形不能直接用网格 UV,世界空间 XZ 投影又在哪里失效。
  2. 案例 20.2 三平面映射 Triplanar 入门让贴图在任意朝向的表面上都不拉伸,并理解它的混合权重和代价。
  3. 案例 20.3 法线贴图的 Triplanar:UDN、Whiteout 与 RNM 进阶给三平面映射加上法线贴图,并且光照正确。
  4. 案例 20.4 高度/坡度自动材质:草 → 砂石 → 岩石 → 雪 进阶一个 Shader 自动给整块地形分配四种地表,并且层间过渡自然。
  5. 案例 20.5 高度混合 Height Blend 进阶让两层材质的过渡由各自的高度决定,而不是简单的半透明叠加。
  6. 案例 20.6 Splatmap 四层混合:读懂 TerrainLit 的数据布局 进阶实现手绘权重图驱动的四层混合,并对照 URP TerrainLit 理解 Unity Terrain 是怎么做的。
  7. 案例 20.7 RenderMeshInstanced 画一片草地 进阶不创建任何 GameObject,用 GPU Instancing 画出上万丛草,每丛颜色略有不同。
  8. 案例 20.8 草的交互压弯 进阶角色或物体经过时,周围的草被推开、压低。
  9. 案例 20.9 距离淡出:缩短与抖动裁剪 进阶草在远处平滑地消失,而不是在某个距离“啪”地断掉。
  10. 案例 20.10 综合:一块完整的小地形 进阶把本章的技术组合起来。

第 21 章 UV 动画与粒子

  1. 案例 21.1 UV 滚动:流动的熔岩 入门只用一张灰度噪声图,做出缓慢流动、亮暗翻滚的熔岩河。
  2. 案例 21.2 序列帧 Flipbook 与帧间混合 入门播放一张 4×4 的序列帧图集,并理解“帧间混合”到底做了什么。
  3. 案例 21.3 Flowmap:沿任意方向流动 进阶让贴图沿一张“流向图”规定的方向流动,绕过石头、在漩涡处打转,并且没有周期性的跳变。
  4. 案例 21.4 极坐标漩涡传送门 进阶用一个 Quad 做出旋转、吸入的传送门漩涡,并修掉 atan2 带来的接缝。
  5. 案例 21.5 通用粒子 Shader:顶点色与混合模式 入门写一个可以替代 Particles/Unlit 大部分用途的粒子 Shader,理解几种混合模式的差别。
  6. 案例 21.6 软粒子:与场景的柔和相交 进阶消除粒子面片插进地面、墙壁时那条生硬的直线。
  7. 案例 21.7 Custom Vertex Streams:粒子系统里的帧间混合 进阶让真实的粒子系统驱动我们的 Shader,播放序列帧并做帧间混合。
  8. 案例 21.8 热扭曲:采样 Opaque Texture 进阶火焰上方的空气抖动,透过它看到的背景在晃动。
  9. 案例 21.9 综合:夜晚的篝火 进阶把本章的技术组合成一个完整的小场景。

第 22 章 贴花

  1. 案例 22.1 用 Decal Projector 贴花 入门在场景里放几个 Decal Projector:台阶边缘的警示条纹、地面的喷漆箭头、箱子上的弹孔和地上的血迹。
  2. 案例 22.2 DBuffer 与屏幕空间对比 入门同一组贴花在两种技术下的效果与取舍。
  3. 案例 22.3 角度淡出:开启 Decal Shader Graph 的 Angle Fade 进阶贴花在与投影方向接近平行的表面上自动淡出,消除拉伸。
  4. 案例 22.4 屏幕空间贴花:深度重建与盒内裁剪 进阶实现上面五步,得到一个可以贴在任意几何体上的贴花。
  5. 案例 22.5 由深度重建法线与角度衰减 进阶知道每个像素所在表面的朝向,在侧面上淡出贴花。
  6. 案例 22.6 让贴花正确受光 进阶贴花在阴影里应该变暗,受到点光时应该被照亮。
  7. 案例 22.7 Z-Fighting 与深度偏移 Offset 入门理解共面网格为什么闪烁,用 Offset 解决。
  8. 案例 22.8 生成贴合曲面的网格贴花 高阶给定一个投影盒,从目标网格上裁出盒内的三角形,生成一块紧贴曲面的贴花网格。
  9. 案例 22.9 综合:弹孔、脚印与血迹 进阶在一个场景里混合使用三种贴花,各取所长。

第 23 章 阴影进阶

  1. 案例 23.1 级联可视化调试 Shader 入门调级联划分时,最直观的办法是直接看到每一级覆盖哪里。写一个调试 Shader,把 ComputeCascadeIndex…
  2. 案例 23.2 平面投影阴影 + 模板防重叠 进阶给角色 Shader 增加一个 Pass,把网格投影到 _PlaneHeight 高度的地面上,画成半透明阴影色;用模板…
  3. 案例 23.3 跟随物体的 Blob 阴影 入门一个 Shader 画出中间实、边缘软的圆斑;一个 C# 组件每帧把它贴到物体正下方的地面上,并根据离地高度放大、变淡。
  4. 案例 23.4 可着色的阴影 入门
  5. 案例 23.5 让自定义 Shader 支持屏幕空间阴影 入门
  6. 案例 23.6 半透明物体的抖动阴影 进阶
  7. 案例 23.7 用 Renderer Feature 实现接触阴影 高阶仿照 URP 自带的 Screen Space Shadows 的结构,写一个 Renderer Feature,在深度…

第 24 章 Shader Graph

  1. 案例 24.1 Enum 与 Boolean Keyword 入门一张图里放三种程序化图案(条纹、圆点、棋盘),用 Enum Keyword 在材质上切换;再用一个 Boolean Ke…
  2. 案例 24.2 在 Graph 中读取主光与阴影 进阶写一个 File 模式的 Custom Function,输入世界坐标,输出主光方向、颜色、距离衰减和阴影衰减,可以同时…
  3. 案例 24.3 附加光:兼容 Forward 与 Forward+ 高阶
  4. 案例 24.4 Unlit Graph + Custom Function 的卡通 Shader 进阶用 Unlit Graph 做一个三色阶的卡通 Shader:主光决定明暗分级,阴影并入暗部,受光侧有边缘光,附加光提供…
  5. 案例 24.5 Lit Graph 的溶解效果 入门保留 URP Lit 的完整 PBR 光照,只在表面上做噪声溶解和边缘发光。这类“表面效果 + 标准光照”正是 Lit …

第 25 章 Renderer Feature 与 RTHandle

  1. 案例 25.1 最小可用的 Feature:全屏反色、去色与染色 入门写一个可以直接放进项目的全屏颜色效果:可调的反色、去色和染色。通过这个案例把“Feature + Pass + 全屏 S…
  2. 案例 25.2 生命周期探针与 RenderPassEvent 实验 入门亲眼看到 25.2 节的调用顺序;再用同一个“去色” Pass 放在三个不同事件上,观察插入点对结果的影响,顺便理解案例…
  3. 案例 25.3 不写 C#:Full Screen Pass Renderer Feature 入门学会使用 URP 14 自带的 FullScreenPassRendererFeature,并为它手写两个兼容的 Sha…
  4. 案例 25.4 Render Objects:把某个 Layer 再画一遍 入门用 URP 自带的 RenderObjects Feature,在不改物体材质的前提下,给某个 Layer 的物体叠加一…
  5. 案例 25.5 只给某个 Layer 画一张遮罩 进阶把第 8 层的物体画成纯白剪影,写进一张单通道遮罩 RT。支持两种模式:“透视”(被别的物体挡住的部分也写入)和“只写可…
  6. 案例 25.6 按遮罩给选中层描边 进阶用案例 25.5 的遮罩,给第 8 层物体画出等宽的外描边,并可选半透明纯色填充。这是编辑器里“选中物体橙色描边”的同款…
  7. 案例 25.7 把一个 Layer 渲染到 RT 再合成:整体半透明的“幽灵” 高阶让一个由多个部件拼成的角色整体半透明(隐身、灵魂、回放残影等),并且看不到它内部互相穿插的结构,同时被场景里的物体正确遮…

第 26 章 自定义后处理

  1. 案例 26.1 饱和度与对比度:第一个 Volume 驱动的后处理 入门写一个可以在 Volume 上添加的 “Cookbook/Saturation” 覆盖项,支持饱和度(0 = 灰度)与对…
  2. 案例 26.2 可分离高斯模糊与降采样 进阶实现可调强度的全屏高斯模糊,用于暂停菜单背景、UI 毛玻璃等。
  3. 案例 26.3 Kawase 与 Dual Kawase 模糊 进阶实现移动端常用的两种廉价大半径模糊,并和高斯对比。
  4. 案例 26.4 自制 Bloom:预过滤、下采样金字塔、上采样合成 高阶从零实现一个与 URP 内置 Bloom 思路一致的泛光:只让足够亮的像素发光,光晕大而柔和、不闪烁,参数可由 Volu…
  5. 案例 26.5 径向模糊 入门冲刺、爆炸冲击时的“速度感”:画面沿着指向某个中心的方向被拉出拖影,中心附近保持清晰。
  6. 案例 26.6 色差与暗角:两个效果的叠加 入门实现两种最常见的“镜头感”效果,并通过它们演示多个自定义后处理的组合。
  7. 案例 26.7 像素化与调色板抖动 入门复古像素风:画面由大块的“像素”组成,颜色只有少数几级,并用有序抖动(Ordered Dithering)模拟中间色。
  8. 案例 26.8 CRT 显示器 进阶模拟老式显像管显示器:屏幕鼓起的弯曲、扫描线、荧光粉 RGB 栅格、四角暗、电子枪轻微错位、亮度闪烁。
  9. 案例 26.9 基于深度与法线的 Sobel 描边 高阶全屏描边:所有物体的轮廓、折痕都画出线条,可以叠在原图上,也可以只显示线条做“线稿”效果。和第 14 章的法线外扩描边、…
  10. 案例 26.10 受击红屏 进阶角色受到伤害时,屏幕边缘泛起带有不规则“血丝”的红色,中间区域轻微压暗去色,随后在半秒左右淡出;强度可以随伤害大小变化。

第 27 章 URP 内置后处理全解析

  1. 案例 27.1 受击反馈与低血量去色 入门游戏逻辑调用 OnHit() 时,屏幕边缘闪一下暗红色暗角并带一点色差,随后逐渐恢复;血量低于 30% 时画面逐渐去色。…

第 28 章 屏幕空间技术

  1. 案例 28.1 可视化重建出的世界坐标 入门用两种方法分别重建世界坐标并画出来,肉眼验证它们是对的——这是写任何屏幕空间效果前都应该先做的一步。
  2. 案例 28.2 扫描线 / 雷达波 入门从某点向外扩散的一圈能量波,掠过地面和物体,波前是一条亮边,后面拖着带世界网格的渐隐尾迹。游戏里的“侦测技能”“全息扫描…
  3. 案例 28.3 距离雾与高度雾 进阶写一个屏幕空间的雾:随距离变浓的距离雾、贴着地面堆积的高度雾,以及迎着太阳方向变亮变暖的“内散射”色调。
  4. 案例 28.4 简化版 SSAO,并接入 URP 光照 高阶自己实现一个法线半球采样的 SSAO:随机旋转 + 双边模糊,并按 URP 的约定把结果交给 Lit,只压暗间接光。
  5. 案例 28.5 体积光:步进、抖动、模糊、合成 高阶
  6. 案例 28.6 屏幕空间反射(SSR)原理与最简实现 高阶让光滑地面映出场景里的物体。URP 14 没有内置 SSR,平面反射(第 19 章)又要多渲染一遍场景;SSR 只用已有…

第 29 章 性能优化

  1. 案例 29.1 合批友好的 Shader 与反例 入门写一个同时兼容 SRP Batcher、GPU Instancing 和 LOD Cross-Fade 的最小 Shad…
  2. 案例 29.2 自定义变体剥离脚本 进阶用 IPreprocessShaders 在构建时剥掉项目确定用不到的变体,并在构建结束时输出统计。
  3. 案例 29.3 用 ShaderVariantCollection 分帧预热 入门
  4. 案例 29.4 远离原点的精度事故 入门复现“用 half 保存世界坐标再算 UV”在远离原点时的问题。由于桌面平台可能把 half 当 float,这里按 h…
  5. 案例 29.5 Overdraw 热度图 Renderer Feature 进阶写一个 Feature,把场景里每个像素被绘制的次数画成热度图,直观地找出 Overdraw 热点。
  6. 案例 29.6 Mip 级别可视化 入门把 GPU 实际选择的 Mip 级别画成颜色,检查贴图分辨率和平铺是否合理。

第 30 章 调试与排错

  1. 案例 30.1 可切换输出的调试视图 Shader 入门写一个带法线贴图、能接收阴影的 Shader,用一个枚举属性切换输出最终光照、世界法线、UV、N·L、阴影衰减、切线空间…