Unity URP Shader 案例目录(234 个)
从第一个 URP Shader 到 PBR、卡通渲染、水、溶解、贴花、后处理。每个案例都有完整代码,配图可在浏览器里实时预览、调参数、改代码。
第 1 章 从像素说起:GPU 渲染管线与坐标空间
- 案例 1.1 坐标空间“调色板”:把各个空间画出来 入门写一个调试 Shader,把一个点在物体空间、世界空间、观察空间、NDC、裁剪空间 w、像素坐标下的值“涂”在物体表面上…
- 案例 1.2 法线可视化与非均匀缩放的坑 入门把物体空间、世界空间、观察空间的法线分别画出来;再用“正确”和“错误”两种方式变换法线并计算漫反射,对比非均匀缩放下的差…
- 案例 1.3 在裁剪空间里直接画:原始深度 vs 线性深度 进阶读取 URP 的相机深度纹理 _CameraDepthTexture,分别显示原始深度、Linear01Depth、Li…
- 案例 1.4 透视校正插值 vs 仿射插值 入门复现 1.7 节说的“仿射插值”,看看没有透视校正的纹理是什么样子。
- 案例 1.5 屏幕 UV:除法放在顶点还是片元 进阶搞清楚为什么 URP 的 positionNDC(以及旧的 ComputeScreenPos)返回的是“没除 w”的值,…
第 2 章 URP 架构与一帧的流程
- 案例 2.1 帧快照:一格一格看一帧怎么画出来 进阶写一个 Renderer Feature,在指定的 RenderPassEvent 时刻把相机颜色缓冲“拍”一张快照,等…
- 案例 2.2 Depth Texture 与 Opaque Texture 的开关 入门写一个极简水面,同时用到深度纹理(深浅颜色、岸边白沫)和不透明纹理(折射),然后分别关掉 URP Asset 里的两个开…
- 案例 2.3 同一场景:Forward vs Forward+ vs Deferred 入门用 24 盏彩色点光源照亮一块 16 米 × 16 米的地面和 15 个小球,依次切换三种渲染路径,直观对比。URP A…
- 案例 2.4 Forward 的每物体光源上限 入门仍用 Forward 路径,分别尝试“把上限提到 8”和“把地面拆成 12×12 块”,理解每物体上限的含义。
- 案例 2.5 同一个 Shader 的三个 Pass,谁会被画? 进阶写一个有三个 Pass 的 Shader:UniversalForward 做正常着色、一个不写 LightMode 的…
- 案例 2.6 兼容与不兼容 SRP Batcher 的 Shader 入门对比两个功能完全相同的 Shader,一个兼容 SRP Batcher,一个不兼容,并学会检查兼容性。
- 案例 2.7 第一人称手持物:清不清深度 入门用 Overlay 相机渲染一个“拿在手里”的物体,对比 Clear Depth 关闭和开启的效果。
- 案例 2.8 MSAA、Render Scale 与 HDR 的直观对比 入门在同一场景里只改 URP Asset 的一项设置,看清楚每个开关到底改变了什么。
第 3 章 第一个 URP Shader
- 案例 3.1 最小可运行:纯色 Unlit 入门写出能在 URP 下编译、把物体涂成一个纯色的 Shader,并看懂每一行。
- 案例 3.2 纹理采样与 Tiling/Offset 入门给物体贴一张图,并让材质面板上的 Tiling、Offset 生效。
- 案例 3.3 顶点色 入门读取网格自带的顶点色,与贴图和颜色相乘。顶点色是最便宜的“逐顶点数据通道”:美术可以在 DCC 软件里刷上 AO、渐变、…
- 案例 3.4 透明度裁剪 Alpha Clip 入门让贴图 alpha 低于阈值的像素“消失”,做出镂空的树叶、栅栏、铁丝网。
- 案例 3.5 接入雾效 入门让 Shader 响应 Window › Rendering › Lighting › Environment › Fo…
- 案例 3.6 兼容 SRP Batcher 入门把材质属性放进 UnityPerMaterial 常量缓冲区,让这个 Shader 能被 SRP Batcher 加速;…
- 案例 3.7 投射阴影与写入深度:ShadowCaster 与 DepthOnly 进阶让物体能投射阴影(包括镂空形状的阴影),并能出现在深度图 _CameraDepthTexture 里。
- 案例 3.8 关键字:用 multi_compile 与 shader_feature 做开关 进阶让顶点色、Alpha Clip、UV 来源都能在材质面板上开关,而且关掉的功能不产生任何运行时开销。
- 案例 3.9 迁移实战:把 Built-in 的滚动贴图 Shader 搬到 URP 进阶拿一个典型的 Built-in 管线 Unlit Shader(滚动贴图 + 顶点色 + 雾),逐行改成 URP 写法。…
第 4 章 Shader 里的数学工具箱与程序化图案
- 案例 4.1 在 Shader 里画函数曲线 入门写一个“示波器” Shader,把任意函数 y = f(x) 画成带网格和坐标轴的曲线。调参数学函数时,这比在脑子里想象…
- 案例 4.2 棋盘格、条纹与波点 入门用 4.3 节的“编号 + 局部坐标”结构做三种最常见的重复图案,并支持旋转和抗锯齿。
- 案例 4.3 圆形进度条与分段血条 进阶做两个游戏 UI 里最常见的程序化控件:带圆头和外发光的环形进度条;带受伤拖尾、分段刻度和低血量闪烁的血条。全部由材质参…
- 案例 4.4 极坐标图案:花瓣、螺旋与放射光 进阶在极坐标下画三个经典图案,并处理 atan2 接缝带来的抗锯齿问题。
- 案例 4.5 白噪声、Value、Gradient、Simplex 并排对比 进阶用同一个 Shader、同样的缩放,把四种噪声并排画出来,叠加整数格线,直观看到它们的区别。
- 案例 4.6 Voronoi 细胞 进阶生成 Voronoi(又称 Worley、细胞噪声)图案,分别展示“到最近点的距离”“细胞边界”和“按细胞上色的鹅卵石”…
- 案例 4.7 fBm 云纹 进阶用分形布朗运动(fractional Brownian motion,fBm)叠加多层噪声,做出一片有大轮廓也有小细节的…
- 案例 4.8 域扭曲:大理石与流体纹理 高阶用噪声扭曲噪声的输入坐标,从普通的 fBm 得到大理石、玛瑙、烟雾般的流动纹理。
- 案例 4.9 SDF 图标:定位图钉,带描边、发光与投影 进阶只用圆、圆角矩形和布尔运算拼出一个“定位图钉”图标,再用距离场一次性做出描边、外发光、内部明暗和软投影。
- 案例 4.10 Bayer 有序抖动 进阶只用两种(或少数几种)颜色表现连续的渐变,理解有序抖动(Ordered Dithering)的原理与 Bayer 矩阵的…
第 5 章 经典光照模型
- 案例 5.1 Lambert 漫反射 入门写出 URP 里最简单的“受光” Shader——主光源的 Lambert 漫反射加球谐环境光,并理解那个无处不在的 N…
- 案例 5.2 Half-Lambert:让暗部不再死黑 入门理解 Valve 在《半条命 2》中提出的 Half-Lambert 光照,用它让角色背光面保留形体。
- 案例 5.3 Wrap Lighting 与交界线染色 进阶用一个参数在 Lambert 和 Half-Lambert 之间连续过渡,并给出“能量守恒”版本;再利用 Wrap 多出…
- 案例 5.4 Phong 高光 入门实现 Bui Tuong Phong 在 1975 年提出的高光模型,理解反射向量、高光指数和它们的几何意义。
- 案例 5.5 Blinn-Phong 与半程向量 入门用半程向量 H 改写 Phong 高光,理解 Blinn-Phong 与 Phong 的形状差异,以及它为什么成了游戏引…
- 案例 5.6 高光指数的能量归一化 进阶理解为什么“调高高光指数,高光却变暗了”,推导 Phong 与 Blinn-Phong 的归一化系数,并在 URP 的 …
- 案例 5.7 粗糙漫反射:Oren-Nayar 与 Minnaert 进阶理解为什么月亮、陶土、粗布在正面光照下“不够立体”,实现 Oren-Nayar 定性模型(并推导出一个不含三角函数的版本…
- 案例 5.8 逐顶点与逐像素光照 入门把同一套 Blinn-Phong 分别放在顶点着色器和片元着色器里计算,直观看到 Gouraud 着色的问题,并知道它在…
- 案例 5.9 经典光照函数库与实验台 进阶把本章的模型整理成一个可复用的 HLSL 函数库,统一接口和约定;再做一个用关键字自由组合漫反射与高光的“实验台” Sh…
第 6 章 多光源与阴影
- 案例 6.1 多光源 Lambert:同时支持 Forward 与 Forward+ 入门在第 5 章 Lambert 的基础上加入附加光循环,写出一个在 Forward(含逐顶点模式)和 Forward+ 下…
- 案例 6.2 自己计算衰减:为什么一定要有平滑窗口 进阶不调用 GetAdditionalLight(),直接读取 URP 上传的光源数组,自己计算距离和角度衰减;对比平方反比…
- 案例 6.3 接收主光源阴影 入门让 Lambert Shader 接收主光源的实时阴影,支持单张阴影图、级联、屏幕空间阴影和三档软阴影,并支持材质级的“…
- 案例 6.4 手写 ShadowCaster Pass 进阶完整实现一个可复用的 ShadowCaster Pass,正确处理方向光与点光/聚光两种投射、深度与法线偏移、近平面压扁…
- 案例 6.5 阴影 Bias 调参对比 进阶亲眼看到粉刺、Peter-Panning 和法线偏移过度三种问题,掌握 Bias 的调参方法。
- 案例 6.6 级联阴影可视化 进阶写一个调试 Shader,按像素所在的级联染色,直观检查级联划分;再对比 1 个和 4 个级联的阴影精度。
- 案例 6.7 附加光阴影 进阶理解点光、聚光阴影的存储方式,让多光源 Shader 正确接收它们。
- 案例 6.8 DepthOnly 与 DepthNormals Pass 入门弄清这两个 Pass 什么时候被调用、缺了会怎样,并写出可复用的实现。
- 案例 6.9 ClassicLit:完整的 Blinn-Phong + 多光源 + 阴影 Shader 高阶把本章所有内容组装成一个可以直接用于项目的 Shader:归一化 Blinn-Phong、球谐环境光、主光源级联软阴影、…
第 7 章 法线贴图与视差
- 案例 7.1 TBN 可视化:检查切线对不对 入门把 T、B、N 以及“法线贴图扰动后的世界空间法线”分别输出成颜色。这是排查法线贴图问题的第一把工具——接缝处明暗跳变、…
- 案例 7.2 砖墙法线贴图 入门写一个标准的切线空间法线贴图 Shader,结构与 URP Lit 一致,并用开关对比“无法线贴图 / 强度 1 / 强…
- 案例 7.3 三种常见错误的实拍对比 入门把“手写 rgb*2−1”和“Y 方向用反”这两个最常见的错误放在同一张图里,记住它们的长相,以后一眼就能认出来。
- 案例 7.4 细节法线:四种混合方法对比 进阶同一组基础法线(砖墙)和细节法线(圆点),用四种方法混合,并分别看最终光照和切线空间结果。四个函数写在一个独立的 inc…
- 案例 7.5 从高度图实时求法线 进阶只有一张高度图,在 Shader 里求出法线,并与离线烘焙的法线贴图对比。
- 案例 7.6 没有切线的网格:在像素里构造 TBN 高阶网格没有 TANGENT 数据,仍然正确地使用切线空间法线贴图。
- 案例 7.7 在自写 Shader 中接入 URP 的单步视差 进阶写一个可以在“无视差 / 单步 / Steep / POM”之间切换的 Shader,先实现前两种。四种模式用 [Key…
- 案例 7.8 POM 砖墙:从单步到光线步进 高阶实现 Steep 与 POM,并做三组对比:四种模式、层数对台阶的影响、高度缩放对深度感的影响。Steep 的实现:
- 案例 7.9 POM 自阴影 高阶在案例 7.8 的基础上加入软自阴影,并把结果乘到主光的衰减上。
第 8 章 环境光、光照贴图与反射探针
- 案例 8.1 用 C# 构造环境光:Color、Gradient 与 Skybox 入门不经过 Lighting 窗口,直接用脚本构造三种来源的球谐环境光,对比它们对物体的影响。这也是在运行时自定义环境光(比…
- 案例 8.2 把球谐基函数“画”出来 入门写一个 Shader,把单位球的每个顶点沿径向推到 |Ylm(方向)| 处,正值涂暖色、负值涂冷色,得到球谐教科书上经典…
- 案例 8.3 每一阶 SH 贡献了什么 进阶用一个色彩强烈的环境(上方暖白、左侧红、右侧蓝、下方偏绿),分别只用 L0、L0+L1、完整三阶来渲染,看清每一阶的作用…
- 案例 8.4 9 个系数到底有多准 进阶选一个高对比度的“摄影棚”环境(深灰背景 + 两块强烈的柔光箱 + 一条暖色轮廓灯),用暴力积分算出真实的辐照度,与 S…
- 案例 8.5 动手烘焙:用 C# 算一张最简光照贴图 进阶光照贴图到底存了什么?与其看 Lighting 窗口里的结果,不如自己算一张。我们写一个只有几十行的“迷你烘焙器”:场景…
- 案例 8.6 粗糙度与 mip:两种映射的对比 入门写一个只输出间接高光的 Shader,分别用 URP 的曲线和线性映射对同一个环境做粗糙度扫描。
- 案例 8.7 自定义环境反射 Cubemap 进阶不用天空盒,而是用自己生成的 Cubemap 作为环境反射(例如产品展示用的“摄影棚”环境、黄昏的天空),并让环境光、背…
- 案例 8.8 盒体投影:让地板的倒影“贴”住墙 进阶搭一个 6 × 3 × 6 米的房间,墙上画网格和一条白色腰线,地板是半光滑的反射面,对比开关盒体投影的效果。
- 案例 8.9 GILit:自写 Shader 接入 SH、光照贴图与反射探针 高阶写出与 URP Lit 在间接光上完全一致的自写 Shader,并能拆分显示各个分量。完整代码如下(较长,后面分段讲解)…
- 案例 8.10 材质 AO 与 SSAO 进阶同一个场景(砖墙 + 白色方块 + 白色球),对比无 AO、只有材质 AO、材质 AO + SSAO 三种情况。为了让环…
- 案例 8.11 Matcap 与环境光照的对比 入门实现带透视修正的 Matcap,并通过移动相机说明它与真正的环境光照的本质区别。
第 9 章 PBR 理论
- 案例 9.1 BRDF 单项可视化 Shader 进阶写一个可以单独输出 D、G、F、镜面项、漫反射项或完整直接光照的 Shader,用一排粗糙度递增的球把每一项“拍”出来。…
- 案例 9.2 GGX、Beckmann 与 Blinn-Phong 的长尾 入门同一个 α,对比三种 NDF 在球面上的样子。
- 案例 9.3 看见 G:遮蔽主要发生在哪里 入门用案例 9.1 的 Shader 输出 G 项(_Mode = 1,高度相关形式),观察它随粗糙度的变化;再对比分离形式…
- 案例 9.4 菲涅尔:F0 扫描与掠射高光 入门先用 F(𝐧·𝐯) 看不同 F0 的“边…
- 案例 9.5 Lambert 与 Disney 漫反射对比 入门把灯放在相机正后方(𝐥=𝐯),这是 Disney 漫反射与 Lamber…
- 案例 9.6 镜面项与完整直接光的粗糙度扫描 进阶看完整的 Cook-Torrance 镜面项和“漫反射 + 镜面”的最终结果怎样随粗糙度变化,体会能量守恒。
- 案例 9.7 白炉测试:BRDF 到底守不守恒 高阶直接把方向反照率 R(𝐯) 画在球上,检验 BRDF 的能量是否守恒。
- 案例 9.8 同一个金球,两种工作流 入门用 URP 自带的 Lit 验证两种工作流在“合法”参数下完全等价,并展示镜面工作流独有的自由度。
- 案例 9.9 在 Gamma 空间算光照会怎样 入门两盏彩色方向光照一个白球,对比线性空间与 Gamma 空间的光照结果。
- 案例 9.10 HDR 截断 vs 色调映射 入门同一个强光场景(太阳强度 4.5、自发光强度 5),对比不做色调映射、Neutral、ACES 三种输出。
第 10 章 逐行读懂 URP Lit
- 案例 10.1 最小 Lit:自己喂数据给 UniversalFragmentPBR 进阶写一个只有一百多行的 Lit Shader:自己填 SurfaceData 和 InputData,直接调用 URP 的…
- 案例 10.2 URP 高光 vs 标准 GGX:并排看 进阶在同一个 Shader 里,用 URP 的 InitializeBRDFData + DirectBRDFSpecula…
- 案例 10.3 白炉测试:URP 的直接高光守恒吗 高阶用第 9 章案例 9.7 的方法,对 URP 的 DirectBRDFSpecular 做白炉测试(F0 = 1),与标…
- 案例 10.4 把 Lit 的光照拆成四项 进阶按 UniversalFragmentPBR 的流程重算一遍,但把直接漫反射、直接高光、间接漫反射、间接高光分开累加,可…
- 案例 10.5 Simple Lit 与 Lit 对比 入门同一个蓝色、同一组光滑度,看两种模型的差别。
- 案例 10.6 金属度 × 光滑度矩阵 入门用 URP Lit 拍一张 5×5 的参数矩阵,作为理解与调参的速查图。行:金属度 0、0.25、0.5、0.75、1(…
第 11 章 从零手写 PBR
- 案例 11.1 BRDF 四件套 进阶把 D、V、F 和 Lambert 写成四个独立的小函数,名字统一加 My 前缀,避免和 core 包 BSDF.hls…
- 案例 11.2 第一步:只有主光的最小 PBR 入门在加任何复杂功能之前,用最少的代码验证 BRDF 是对的。这个 Shader 只读主光方向和颜色,没有阴影、没有环境光、…
- 案例 11.3 Forward Pass:顶点、InputData 与片元 进阶写出 ForwardLit Pass 的顶点、片元函数,并理解为什么我们要填 URP 的 InputData 结构体。
- 案例 11.4 多光源与阴影:Forward 与 Forward+ 进阶在两种渲染路径下都正确遍历附加光,接收主光与附加光阴影。
- 案例 11.5 预滤波环境图与 mip 选择 进阶
- 案例 11.6 环境 BRDF:解析近似与程序生成的 DFG LUT 高阶实现 split-sum 的右半,给出两种方案,并量化它们的差异。
- 案例 11.7 多次散射能量补偿 高阶让粗糙金属不再“越粗糙越暗”,并用白炉测试验证。
- 案例 11.8 法线贴图、Mask Map 与自发光 入门把表面细节接进来,看每一张贴图贡献了什么。
- 案例 11.9 其余四个 Pass 进阶给 MyPBR 补齐投射阴影、深度预渲染、深度法线与烘焙用的 Pass,让它在 URP 的所有功能里都是“一等公民”。
- 案例 11.10 调试视图:把光照拆开看 入门写一个与 MyPBR 共用全部 HLSL 的调试 Shader,单独输出 BRDF 的每一项、光照的每一部分。
第 12 章 PBR 进阶材质
- 案例 12.1 本章的材质框架与基准 GGX 进阶写一个最小但完整的金属度工作流 Shader 作为“基准材质”,并把光源循环、顶点处理等公共代码拆成可复用的 inclu…
- 案例 12.2 金属漆:清漆 + 程序化金属片 进阶实现带能量衰减、能修正底层的清漆材质,底层加一层程序化的金属片(flake)让车漆“闪”起来;用白炉测试验证能量,并与 …
- 案例 12.3 拉丝金属与同心圆拉丝 进阶用各向异性 GGX 做出直线拉丝(纽结、圆环)和同心圆拉丝(锅底、旋钮),并处理各向异性下的环境反射。
- 案例 12.4 Kajiya-Kay 双高光头发 进阶在一个球形“发帽”上实现双高光头发,对比 Blinn-Phong、单条 KK、双条 KK,并展示偏移噪声的作用。
- 案例 12.5 丝绒:Charlie sheen 布料 进阶实现布料着色,对比“把布当塑料(GGX)”、Charlie sheen、Charlie + 次表面色三种做法,并加一层程…
- 案例 12.6 皮肤:Wrap 与程序生成的预积分 LUT 高阶在 C# 里数值积分生成预积分皮肤 LUT(同时提供编辑器菜单把它烘焙成贴图);Shader 里用屏幕空间导数估计曲率,…
- 案例 12.7 背光的树叶 进阶做一组双面的程序化树叶,对比无透射、均匀透射、按叶脉厚度透射三种情况。
- 案例 12.8 油膜与彩虹色 高阶用干涉反射率替换 GGX 里的 Schlick 菲涅尔,做出油膜效果;对比 3 波长、16 波长光谱积分,以及 core…
- 案例 12.9 材质展台与取舍 进阶把本章的材质放进同一个场景,检查它们在同一套光照下是否协调,并总结每种材质的代价与适用场合。
第 13 章 PBR 材质制作与校准
- 案例 13.1 程序化刷漆金属:一套参数生成三张贴图 进阶用 C# 从一组参数生成 Albedo、Mask、Normal 三张贴图,体会“各通道从同一份结构派生、彼此对得上”的制…
- 案例 13.2 写一个“PBR 校验”Shader 进阶写一个读取 URP Lit 材质属性的校验 Shader,按 PBR 原则把超出范围的像素用醒目的斜条纹标出来,并能一键…
- 案例 13.3 批量检查贴图导入设置 入门写一个编辑器菜单,按命名约定检查贴图的 sRGB 和 Normal Map 设置,并检查材质的法线槽里是否放了非法线贴图…
- 案例 13.4 砖墙 PBR 套图 入门用配套的 bricks 套图(Albedo、Normal、Mask、Height)在 URP Lit 中组装一面砖墙,观…
第 14 章 卡通渲染
- 案例 14.1 色阶化:从 Lambert 到 Ramp 入门把平滑的漫反射切成明暗两档(或多档),比较 step、smoothstep 和 Ramp 贴图三种做法。
- 案例 14.2 阴影色:不要只是“变暗” 入门理解为什么卡通渲染的暗部要用单独指定的颜色,而不是“固有色 × 系数”,并加上第二层阴影。
- 案例 14.3 边缘光:菲涅尔与屏幕空间深度 进阶实现三种边缘光——纯菲涅尔、只在受光侧出现的菲涅尔、屏幕空间等宽的深度边缘光,并比较它们的特点。
- 案例 14.4 风格化高光:圆斑、色块、方块 进阶把高光做成一块硬边色块,并通过平移、缩放、分裂、方形化来控制它的形状。
- 案例 14.5 裁剪空间等宽描边 进阶实现背面外扩描边,比较物体空间外扩与裁剪空间外扩的线宽差异,并理解为什么一个 Pass 用 SRPDefaultUnli…
- 案例 14.6 平滑法线烘焙工具 进阶解决硬边模型的描边断裂问题——写一个编辑器工具,把平滑后的法线烘焙进切线或顶点色;并在拍摄脚本里对程序化网格调用同一个烘…
- 案例 14.7 头发天使环 进阶做出二次元角色头顶那圈亮环(天使环,Angel Ring),比较写实的连续发丝高光与色阶化的天使环。
- 案例 14.8 程序生成脸部阈值图与 SDF 面部阴影 高阶在 C# 里程序生成一套“二值图 → SDF → 阈值图”的完整流程(用一条带鼻子凸起的解析曲线代替美术手绘),在 Sh…
- 案例 14.9 卡通化的接收阴影 进阶让物体接收的投影也符合卡通风格:硬边、使用阴影色,而且与自身的明暗交界协调。
- 案例 14.10 完整的 Toon Shader 高阶把本章的所有部件组装成一个可直接用于项目的卡通 Shader:两层阴影色或 Ramp 贴图、卡通化的接收阴影、风格化高光…
第 15 章 更多风格化(NPR)
- 案例 15.1 Gooch 冷暖着色 入门在技术插图风格里,让背光面依然清楚可读——不是变黑,而是变“冷”。
- 案例 15.2 素描排线(Hatching) 进阶用 TAM 把受光强度变成笔触疏密,支持物体 UV 与屏幕空间两种贴法,并可给纸面上色。
- 案例 15.3 半调网点(Halftone) 进阶模拟报纸和漫画印刷的网点效果:单色版用黑色圆点表现明暗,彩色版用 C、M、Y、K 四色网点叠印出彩色。
- 案例 15.4 水彩与纸张感 进阶在不做后处理的前提下,让物体看起来像是用水彩一层层罩染在纸上的。
- 案例 15.5 复古像素风:PS1 的顶点抖动与仿射贴图 进阶复刻初代 PlayStation 的画面特征:顶点在屏幕上一格一格地跳、地面贴图随视角扭曲、贴图是硬边的大像素、颜色有明…
- 案例 15.6 Matcap 风格化 入门用一张“材质球照片”决定物体的全部外观;程序化生成几种风格的 Matcap,并修正 Matcap 在画面边缘的透视畸变。
- 案例 15.7 低多边形 flat shading:用 ddx/ddy 求面法线 入门不修改网格,让光滑物体呈现出“一面一色”的低多边形(Low Poly)风格。
- 案例 15.8 重心坐标线框与全息效果 进阶在不使用几何着色器的前提下画出恒定像素宽度的三角形线框,支持隐藏四边形对角线,并做成发光的全息风格。
第 16 章 透明、混合与模板测试
- 案例 16.1 混合模式大比拼 入门用一个 Shader 切出六种常见混合模式,在同一个背景(上半黑→白渐变、下半色相条)上叠三张红绿蓝圆盘,直观对比。
- 案例 16.2 ZTest / ZWrite / Cull 实验台 入门把三个状态都做成材质属性,在“一面墙挡住一个纽结”的场景里观察不同组合。
- 案例 16.3 透明排序问题与双 Pass 预深度 进阶复现半透明物体最常见的两类排序错误,并用“先写深度、再画颜色”的双 Pass 解决自身穿插问题。
- 案例 16.4 Alpha Clip 与 Alpha to Coverage 进阶比较铁丝网这类“细镂空”材质的三种做法,理解 Alpha to Coverage 的原理以及 alpha 锐化。
- 案例 16.5 抖动透明(Dither) 入门让物体“半透明”却不进透明队列——依然写深度、依然投影、完全不用排序。
- 案例 16.6 双面材质 入门让只有一层面的网格(树叶、纸片、旗帜、布料、开口的碗)正反两面都正确受光,并能给背面不同的颜色。
- 案例 16.7 X 光透视:被遮挡的部分显示剪影 进阶角色走到墙后时,被墙挡住的部分显示为发光的剪影,而角色自身可见的部分不受影响。
- 案例 16.8 传送门 / 窗口 进阶一扇门框里能看到另一个世界——紫色天幕、青色地面和几个物体,它们只在门框范围内可见;从侧面看,门里的世界依然在“门后”。
- 案例 16.9 用 RenderObjects 显示被遮挡部分的轮廓色 进阶不修改角色的任何材质和 Shader(角色用的是 URP 自带的 Lit),只通过 URP 自带的 Render Obj…
第 17 章 顶点动画
- 案例 17.1 旗帜飘动 入门一面固定在旗杆上的旗子,波浪从旗杆向外传播,越靠外摆幅越大,并叠加噪声制造阵风般的不规则起伏;正确重算法线。
- 案例 17.2 阴影 Pass 同步顶点偏移 入门直观看到“只在颜色 Pass 里做顶点动画”的后果,理解为什么必须在 ShadowCaster、DepthOnly 中做…
- 案例 17.3 草地风动 进阶一大片草(6 万根,合并成一个网格)在世界空间风场中起伏:成片的阵风扫过草地,每根草又各有细小的摆动;根部不动、越往上越…
- 案例 17.4 Gerstner 波 高阶用 Gerstner 波叠加出尖峰平谷的海面,法线用解析偏导数精确计算,并用雅可比行列式在波峰挤压处生成泡沫。
- 案例 17.5 膨胀与呼吸 入门让物体整体膨胀收缩(呼吸、心跳、充气),以及一道从下往上传播的“脉冲”;理解硬边模型膨胀时的裂缝问题。
- 案例 17.6 碎裂与吸附重组 进阶物体沿某个方向逐渐碎成三角形碎片:碎片绕自身中心旋转、沿面法线飞出、受“重力”下落并缩小,刚脱落时发出橙色辉光;把进度反…
- 案例 17.7 VAT:顶点动画贴图 高阶把一段“任意复杂”的逐顶点动画烘焙进两张贴图,运行时由 Shader 回放;同一份数据可以被多个实例以不同的帧偏移播放。
第 18 章 溶解、全息与护盾
- 案例 18.1 噪声溶解:用 clip 挖洞 入门给物体一个 0~1 的进度参数,进度增加时物体表面按噪声图案一块块消失,并且它投在地上的影子同步“溶掉”。
- 案例 18.2 边缘发光:让溶解有“燃烧”的前沿 入门在溶解的前沿加一条发光的边,可以是纯色硬边(科幻风格的“数字化消散”),也可以是从暗红到亮黄的渐变火边(燃烧)。
- 案例 18.3 方向溶解与球形溶解 进阶让溶解有方向感——比如角色从头到脚被“传送”走;或者从一个点向外扩散——比如被魔法击中的位置先开始瓦解。
- 案例 18.4 菲涅尔边缘光 入门让物体轮廓处出现一圈亮边。这是“被选中高亮”“能量体”“背光轮廓”最常用的手法,也是本章后面全息、护盾、冰面的组成部分。
- 案例 18.5 全息投影:扫描线、闪烁、故障与色差 进阶做一个科幻风格的全息投影:半透明发光的“光壳”,表面有横向扫描线,有一条亮带缓慢扫过,偶尔闪烁、偶尔横向错位(故障),轮…
- 案例 18.6 能量护盾(上):深度交接高亮 进阶一个半球形能量护盾罩在地面上,护盾与地面、与穿过它的物体相交的地方出现一圈亮线,就像能量场被“挤压”一样。
- 案例 18.7 能量护盾(下):六边形网格与受击涟漪 高阶给护盾加上蜂窝状六边形网格,每个格子有自己的明暗呼吸;被击中时,从命中点扩散出一圈光环,光环经过的格子被点亮,护盾表面同…
- 案例 18.8 扭曲隐身:采样不透明纹理 进阶光学迷彩。物体几乎透明,但它会把身后的画面轻微“弯折”,轮廓处还有一圈淡淡的亮边,运动时有热浪一样的抖动。
- 案例 18.9 冰冻覆盖:世界空间自上而下结冰 进阶一个参数 _Freeze 从 0 到 1,物体从朝上的表面开始结冰,逐渐蔓延到侧面、底面;冰层有厚度、有裂纹、边缘泛蓝白…
- 案例 18.10 X 光扫描线 进阶一道水平光带从下往上扫过场景里的物体,光带下方紧跟着一段“X 光”样式的拖尾:暗色底、亮轮廓、世界空间网格线;拖尾之后物…
第 19 章 水
- 案例 19.1 搭场景:一个有深有浅的水池 入门准备一个能“考验”水面的场景,并放上最朴素的水:一块单色半透明平面。
- 案例 19.2 深度着色:深的地方更深 入门让水的颜色和透明度随水深变化:浅处清澈泛青,深处浓重发蓝;岸边水深趋于 0 时平滑过渡,不出现硬边。
- 案例 19.3 折射与吸收 进阶水底的画面被水面的起伏弯折;光在水里按颜色被吸收,深处偏蓝绿;同时解决折射最常见的瑕疵——水面上方的物体“漏”进水里。
- 案例 19.4 双法线流动 进阶用法线贴图给水面加上细碎的波纹,并让波纹“流动”起来,同时避免一眼就能看出的重复平铺。
- 案例 19.5 菲涅尔与天空反射 进阶水面反射天空;低头看时几乎透明,看向远处时像镜子。
- 案例 19.6 太阳高光 入门太阳在水面上拉出一条闪烁的亮带(日光路径),被柱子挡住的地方没有高光。
- 案例 19.7 岸边泡沫 进阶岸线、礁石和柱子周围出现白色泡沫:贴岸的一条不规则实心带,外面还有一圈圈向岸边推进的细泡沫线。
- 案例 19.8 焦散:程序化 Voronoi 投射到水下 高阶水底出现游动的亮纹网;只出现在水下、只出现在朝上的面上、深处逐渐消失、柱子的阴影里没有;亮纹边缘带一点彩虹色的色散。
- 案例 19.9 Gerstner 波 进阶让水面真正起伏,有波峰波谷,并且波峰比波谷尖——这是 Gerstner 波和简单正弦波最明显的区别。
- 案例 19.10 平面反射:C# 反射相机 + RenderTexture 高阶水面倒映出岸上的柱子、石头和木栈道,而不只是天空。
第 20 章 地形与植被
- 案例 20.1 世界空间 UV 与陡坡拉伸 入门理解为什么地形不能直接用网格 UV,世界空间 XZ 投影又在哪里失效。
- 案例 20.2 三平面映射 Triplanar 入门让贴图在任意朝向的表面上都不拉伸,并理解它的混合权重和代价。
- 案例 20.3 法线贴图的 Triplanar:UDN、Whiteout 与 RNM 进阶给三平面映射加上法线贴图,并且光照正确。
- 案例 20.4 高度/坡度自动材质:草 → 砂石 → 岩石 → 雪 进阶一个 Shader 自动给整块地形分配四种地表,并且层间过渡自然。
- 案例 20.5 高度混合 Height Blend 进阶让两层材质的过渡由各自的高度决定,而不是简单的半透明叠加。
- 案例 20.6 Splatmap 四层混合:读懂 TerrainLit 的数据布局 进阶实现手绘权重图驱动的四层混合,并对照 URP TerrainLit 理解 Unity Terrain 是怎么做的。
- 案例 20.7 RenderMeshInstanced 画一片草地 进阶不创建任何 GameObject,用 GPU Instancing 画出上万丛草,每丛颜色略有不同。
- 案例 20.8 草的交互压弯 进阶角色或物体经过时,周围的草被推开、压低。
- 案例 20.9 距离淡出:缩短与抖动裁剪 进阶草在远处平滑地消失,而不是在某个距离“啪”地断掉。
- 案例 20.10 综合:一块完整的小地形 进阶把本章的技术组合起来。
第 21 章 UV 动画与粒子
- 案例 21.1 UV 滚动:流动的熔岩 入门只用一张灰度噪声图,做出缓慢流动、亮暗翻滚的熔岩河。
- 案例 21.2 序列帧 Flipbook 与帧间混合 入门播放一张 4×4 的序列帧图集,并理解“帧间混合”到底做了什么。
- 案例 21.3 Flowmap:沿任意方向流动 进阶让贴图沿一张“流向图”规定的方向流动,绕过石头、在漩涡处打转,并且没有周期性的跳变。
- 案例 21.4 极坐标漩涡传送门 进阶用一个 Quad 做出旋转、吸入的传送门漩涡,并修掉 atan2 带来的接缝。
- 案例 21.5 通用粒子 Shader:顶点色与混合模式 入门写一个可以替代 Particles/Unlit 大部分用途的粒子 Shader,理解几种混合模式的差别。
- 案例 21.6 软粒子:与场景的柔和相交 进阶消除粒子面片插进地面、墙壁时那条生硬的直线。
- 案例 21.7 Custom Vertex Streams:粒子系统里的帧间混合 进阶让真实的粒子系统驱动我们的 Shader,播放序列帧并做帧间混合。
- 案例 21.8 热扭曲:采样 Opaque Texture 进阶火焰上方的空气抖动,透过它看到的背景在晃动。
- 案例 21.9 综合:夜晚的篝火 进阶把本章的技术组合成一个完整的小场景。
第 22 章 贴花
- 案例 22.1 用 Decal Projector 贴花 入门在场景里放几个 Decal Projector:台阶边缘的警示条纹、地面的喷漆箭头、箱子上的弹孔和地上的血迹。
- 案例 22.2 DBuffer 与屏幕空间对比 入门同一组贴花在两种技术下的效果与取舍。
- 案例 22.3 角度淡出:开启 Decal Shader Graph 的 Angle Fade 进阶贴花在与投影方向接近平行的表面上自动淡出,消除拉伸。
- 案例 22.4 屏幕空间贴花:深度重建与盒内裁剪 进阶实现上面五步,得到一个可以贴在任意几何体上的贴花。
- 案例 22.5 由深度重建法线与角度衰减 进阶知道每个像素所在表面的朝向,在侧面上淡出贴花。
- 案例 22.6 让贴花正确受光 进阶贴花在阴影里应该变暗,受到点光时应该被照亮。
- 案例 22.7 Z-Fighting 与深度偏移 Offset 入门理解共面网格为什么闪烁,用 Offset 解决。
- 案例 22.8 生成贴合曲面的网格贴花 高阶给定一个投影盒,从目标网格上裁出盒内的三角形,生成一块紧贴曲面的贴花网格。
- 案例 22.9 综合:弹孔、脚印与血迹 进阶在一个场景里混合使用三种贴花,各取所长。
第 23 章 阴影进阶
- 案例 23.1 级联可视化调试 Shader 入门调级联划分时,最直观的办法是直接看到每一级覆盖哪里。写一个调试 Shader,把 ComputeCascadeIndex…
- 案例 23.2 平面投影阴影 + 模板防重叠 进阶给角色 Shader 增加一个 Pass,把网格投影到 _PlaneHeight 高度的地面上,画成半透明阴影色;用模板…
- 案例 23.3 跟随物体的 Blob 阴影 入门一个 Shader 画出中间实、边缘软的圆斑;一个 C# 组件每帧把它贴到物体正下方的地面上,并根据离地高度放大、变淡。
- 案例 23.4 可着色的阴影 入门
- 案例 23.5 让自定义 Shader 支持屏幕空间阴影 入门
- 案例 23.6 半透明物体的抖动阴影 进阶
- 案例 23.7 用 Renderer Feature 实现接触阴影 高阶仿照 URP 自带的 Screen Space Shadows 的结构,写一个 Renderer Feature,在深度…
第 24 章 Shader Graph
- 案例 24.1 Enum 与 Boolean Keyword 入门一张图里放三种程序化图案(条纹、圆点、棋盘),用 Enum Keyword 在材质上切换;再用一个 Boolean Ke…
- 案例 24.2 在 Graph 中读取主光与阴影 进阶写一个 File 模式的 Custom Function,输入世界坐标,输出主光方向、颜色、距离衰减和阴影衰减,可以同时…
- 案例 24.3 附加光:兼容 Forward 与 Forward+ 高阶
- 案例 24.4 Unlit Graph + Custom Function 的卡通 Shader 进阶用 Unlit Graph 做一个三色阶的卡通 Shader:主光决定明暗分级,阴影并入暗部,受光侧有边缘光,附加光提供…
- 案例 24.5 Lit Graph 的溶解效果 入门保留 URP Lit 的完整 PBR 光照,只在表面上做噪声溶解和边缘发光。这类“表面效果 + 标准光照”正是 Lit …
第 25 章 Renderer Feature 与 RTHandle
- 案例 25.1 最小可用的 Feature:全屏反色、去色与染色 入门写一个可以直接放进项目的全屏颜色效果:可调的反色、去色和染色。通过这个案例把“Feature + Pass + 全屏 S…
- 案例 25.2 生命周期探针与 RenderPassEvent 实验 入门亲眼看到 25.2 节的调用顺序;再用同一个“去色” Pass 放在三个不同事件上,观察插入点对结果的影响,顺便理解案例…
- 案例 25.3 不写 C#:Full Screen Pass Renderer Feature 入门学会使用 URP 14 自带的 FullScreenPassRendererFeature,并为它手写两个兼容的 Sha…
- 案例 25.4 Render Objects:把某个 Layer 再画一遍 入门用 URP 自带的 RenderObjects Feature,在不改物体材质的前提下,给某个 Layer 的物体叠加一…
- 案例 25.5 只给某个 Layer 画一张遮罩 进阶把第 8 层的物体画成纯白剪影,写进一张单通道遮罩 RT。支持两种模式:“透视”(被别的物体挡住的部分也写入)和“只写可…
- 案例 25.6 按遮罩给选中层描边 进阶用案例 25.5 的遮罩,给第 8 层物体画出等宽的外描边,并可选半透明纯色填充。这是编辑器里“选中物体橙色描边”的同款…
- 案例 25.7 把一个 Layer 渲染到 RT 再合成:整体半透明的“幽灵” 高阶让一个由多个部件拼成的角色整体半透明(隐身、灵魂、回放残影等),并且看不到它内部互相穿插的结构,同时被场景里的物体正确遮…
第 26 章 自定义后处理
- 案例 26.1 饱和度与对比度:第一个 Volume 驱动的后处理 入门写一个可以在 Volume 上添加的 “Cookbook/Saturation” 覆盖项,支持饱和度(0 = 灰度)与对…
- 案例 26.2 可分离高斯模糊与降采样 进阶实现可调强度的全屏高斯模糊,用于暂停菜单背景、UI 毛玻璃等。
- 案例 26.3 Kawase 与 Dual Kawase 模糊 进阶实现移动端常用的两种廉价大半径模糊,并和高斯对比。
- 案例 26.4 自制 Bloom:预过滤、下采样金字塔、上采样合成 高阶从零实现一个与 URP 内置 Bloom 思路一致的泛光:只让足够亮的像素发光,光晕大而柔和、不闪烁,参数可由 Volu…
- 案例 26.5 径向模糊 入门冲刺、爆炸冲击时的“速度感”:画面沿着指向某个中心的方向被拉出拖影,中心附近保持清晰。
- 案例 26.6 色差与暗角:两个效果的叠加 入门实现两种最常见的“镜头感”效果,并通过它们演示多个自定义后处理的组合。
- 案例 26.7 像素化与调色板抖动 入门复古像素风:画面由大块的“像素”组成,颜色只有少数几级,并用有序抖动(Ordered Dithering)模拟中间色。
- 案例 26.8 CRT 显示器 进阶模拟老式显像管显示器:屏幕鼓起的弯曲、扫描线、荧光粉 RGB 栅格、四角暗、电子枪轻微错位、亮度闪烁。
- 案例 26.9 基于深度与法线的 Sobel 描边 高阶全屏描边:所有物体的轮廓、折痕都画出线条,可以叠在原图上,也可以只显示线条做“线稿”效果。和第 14 章的法线外扩描边、…
- 案例 26.10 受击红屏 进阶角色受到伤害时,屏幕边缘泛起带有不规则“血丝”的红色,中间区域轻微压暗去色,随后在半秒左右淡出;强度可以随伤害大小变化。
第 27 章 URP 内置后处理全解析
- 案例 27.1 受击反馈与低血量去色 入门游戏逻辑调用 OnHit() 时,屏幕边缘闪一下暗红色暗角并带一点色差,随后逐渐恢复;血量低于 30% 时画面逐渐去色。…
第 28 章 屏幕空间技术
- 案例 28.1 可视化重建出的世界坐标 入门用两种方法分别重建世界坐标并画出来,肉眼验证它们是对的——这是写任何屏幕空间效果前都应该先做的一步。
- 案例 28.2 扫描线 / 雷达波 入门从某点向外扩散的一圈能量波,掠过地面和物体,波前是一条亮边,后面拖着带世界网格的渐隐尾迹。游戏里的“侦测技能”“全息扫描…
- 案例 28.3 距离雾与高度雾 进阶写一个屏幕空间的雾:随距离变浓的距离雾、贴着地面堆积的高度雾,以及迎着太阳方向变亮变暖的“内散射”色调。
- 案例 28.4 简化版 SSAO,并接入 URP 光照 高阶自己实现一个法线半球采样的 SSAO:随机旋转 + 双边模糊,并按 URP 的约定把结果交给 Lit,只压暗间接光。
- 案例 28.5 体积光:步进、抖动、模糊、合成 高阶
- 案例 28.6 屏幕空间反射(SSR)原理与最简实现 高阶让光滑地面映出场景里的物体。URP 14 没有内置 SSR,平面反射(第 19 章)又要多渲染一遍场景;SSR 只用已有…
第 29 章 性能优化
- 案例 29.1 合批友好的 Shader 与反例 入门写一个同时兼容 SRP Batcher、GPU Instancing 和 LOD Cross-Fade 的最小 Shad…
- 案例 29.2 自定义变体剥离脚本 进阶用 IPreprocessShaders 在构建时剥掉项目确定用不到的变体,并在构建结束时输出统计。
- 案例 29.3 用 ShaderVariantCollection 分帧预热 入门
- 案例 29.4 远离原点的精度事故 入门复现“用 half 保存世界坐标再算 UV”在远离原点时的问题。由于桌面平台可能把 half 当 float,这里按 h…
- 案例 29.5 Overdraw 热度图 Renderer Feature 进阶写一个 Feature,把场景里每个像素被绘制的次数画成热度图,直观地找出 Overdraw 热点。
- 案例 29.6 Mip 级别可视化 入门把 GPU 实际选择的 Mip 级别画成颜色,检查贴图分辨率和平铺是否合理。
第 30 章 调试与排错
- 案例 30.1 可切换输出的调试视图 Shader 入门写一个带法线贴图、能接收阴影的 Shader,用一个枚举属性切换输出最终光照、世界法线、UV、N·L、阴影衰减、切线空间…