用Shader Graph定制Driven Decals:子图与12个Shader属性的贴花着色器开发完全手册
【免费下载链接】driven-decalsA mesh-based PBR decal system for Unity's universal render pipeline.项目地址: https://gitcode.com/gh_mirrors/dr/driven-decals
Driven Decals是一款面向 Unity 通用渲染管线(URP)的PBR 贴花系统:它把贴图"投影"到场景网格上,生成一块真正的投影网格,再交给Shader Graph自定义着色器来渲染。本文带你读懂项目中 8 个贴花着色器与 5 个子图(SubGraph)的职责,并给出 12 个 Shader 属性的完整速查表,帮助你快速定制属于自己的 Driven Decals 贴花材质 🎨。
为什么贴花系统离不开 Shader Graph?
Driven Decals 的工作方式是"两步走":
- MeshProjection 投影:把贴花的 UV 信息"打"到目标网格上,生成投影网格(MeshProjection.cs);
- 着色器渲染:由材质上的 Shader Graph 着色器消费这些 UV、边界、淡出等参数,完成最终的 PBR 渲染。
因此,只要你的自定义着色器能正确处理这套参数,就能自由控制贴花的最终外观。下面是官方演示:贴花让圆柱体呈现出开裂混凝土的效果,裂缝下还露出亮色图案。
快速安装:获取 Driven Decals 资产包
- 打开 Unity(2019.3.0f6+ / URP 7.2.1+),进入Window → Package Manager;
- 点击左上角+,选择Add package from git URL...;
- 粘贴仓库地址并添加:
git clone https://gitcode.com/gh_mirrors/dr/driven-decals安装完成后即可在项目窗口看到 Driven Decals。全部内置着色器位于 Runtime/Shaders/,随包免费使用(MIT 协议),详见 package.json。
资产清单:8 个贴花 Shader 与 5 个子图
打开 Runtime/Shaders/ 目录,你会看到按"光照复杂度"分层的一组成品着色器,都可以直接复制到 Inspector 的 Shader 下拉框中使用(输入decal可过滤):
| 着色器 | 适用场景 | 文件 |
|---|---|---|
| Decal Diffuse | 仅漫反射 + 全局 Metallic/Smoothness/Ambient | Decal Diffuse.shadergraph |
| Decal Diffuse Normal | 漫反射 + 法线贴图 | Decal Diffuse Normal.shadergraph |
| Decal Diffuse Emissive | 漫反射 + 自发光 | Decal Diffuse Emissive.shadergraph |
| Decal Diffuse Unlit | 无光照、纯贴图 | Decal Diffuse Unlit.shadergraph |
| Decal Full PBR | 完整 PBR(MSO + 法线) | Decal Full PBR.shadergraph |
| Decal PBR Metallic Unity Style | Unity 风格 Metallic 工作流 | Decal PBR Metallic Unity Style.shadergraph |
| Decal PBR Specular Unity Style | Unity 风格 Specular 工作流 | Decal PBR Specular Unity Style.shadergraph |
| Decal Untextured Unlit | 纯色贴花 | Decal Untextured Unlit.shadergraph |
配合它们工作的还有5 个子图(.shadersubgraph),这是定制时的核心积木:
- Decal UV.shadersubgraph—— 处理 UV 的第一关:按
_Bounds采样正确的纹贴区域,并自动完成_FlipU/_FlipV翻转。切记:不要直接使用网格自带的 UV0 通道,必须先经过它。 - Fade near z bounds.shadersubgraph—— 根据
_ZFadeStart让贴花在接近自身 z 边界时柔和淡出,避免生硬截断。 - Fade by angle.shadersubgraph—— 根据
_MinAngleFadeRadians/_MaxAngleFadeRadians对大角度变形的区域做淡出。 - Flip normal.shadersubgraph—— 翻转法线,用于修正贴花在特定朝向下的光照异常。
- Offset in viewspace.shadersubgraph—— 按
_OffsetViewZ把贴花顶点向相机方向偏移一小段距离,防止 z-fighting(所有内置着色器都使用了它)。
官方示例贴花"紧固件"就是一套完整的 PBR 纹理组(DiffuseAlpha + MSO + Normal),可直接观察各贴图通道的渲染效果:

5 个子图的实际效果:z 淡出与角度淡出
角度淡出(Angle Fade)是最能体现子图价值的功能——当贴花投影到与视角夹角很大的曲面时,边缘会严重拉伸变形,Fade by angle 会按角度区间把它淡掉。两个参数差得越多,过渡越柔和:
核心速查表:12 个 Shader 属性
定制着色器时,Driven Decals 会按名称在材质上查找以下属性(DecalAsset.cs 的 Inspector 会实时提示缺失项)。所有内置着色器都包含这 12 个属性:
| # | 属性 | 类型 | 级别 | 作用 |
|---|---|---|---|---|
| 1 | _DiffuseAlpha | Texture | ✅ 必需 | 漫反射+Alpha;用于 DecalAsset 预览图与缩略图生成 |
| 2 | _Bounds | Vector4 | ✅ 必需 | 定义贴花在纹理上的矩形区域(uMin, vMin, uMax, vMax) |
| 3 | _Opacity | Float 0–1 | 推荐 | 整体不透明度,运行时可经 PropertyBlock 修改 |
| 4 | _FlipU | Bool | 推荐 | 水平翻转纹理区域,Decal UV 子图可直接消费 |
| 5 | _FlipV | Bool | 推荐 | 垂直翻转纹理区域 |
| 6 | _ZFadeStart | Float 0–1 | 推荐 | 靠近 z 边界时的淡出强度,由 Fade near z bounds 实现 |
| 7 | _MinAngleFadeRadians | Float | 推荐 | 角度淡出下限(弧度) |
| 8 | _MaxAngleFadeRadians | Float | 推荐 | 角度淡出上限,与下限之差决定过渡软硬 |
| 9 | _OffsetViewZ | Float | 推荐 | 视空间向相机的偏移量,防 z-fighting |
| 10 | _Metallic | Float | 可选 | 金属度(PBR 着色器) |
| 11 | _Smoothness | Float | 可选 | 光滑度(PBR 着色器) |
| 12 | _Ambient | Float | 可选 | 环境遮蔽强度(PBR 着色器) |
⚠️ 必需属性缺失时贴花系统无法工作;推荐属性缺失时对应功能(淡出、翻转)会失效,但整体仍可运行。
高级着色器还会扩展更多属性,例如 Decal Full PBR 增加了_MetallicSmoothnessOcclusion合并贴图与三个 Multiplier;Decal PBR Specular Unity Style 则引入_SpecularSmoothness、_EmissionMap、_OcclusionMap等,按需参考即可。
三步上手:复制、改造、验证
第 1 步:复制模板。打开 Decal Diffuse Normal.shadergraph(官方推荐的定制起点),另存为自定义 Shader Graph。
第 2 步:保留关键节点。确认图中包含Decal UV子图(接在 UV 采样前)与Offset in viewspace子图(接在顶点位移上),再按需要挂接 Fade 类子图、增删贴图与光照节点。
第 3 步:用 DecalAsset 验证。创建材质并指定新着色器,然后在 DecalAsset Inspector 中拖入材质——若属性缺失会列出清单,贴图预览正常即代表兼容 ✅。
最后把贴花对象(Hierarchy 右键3D Object → Driven Decal)的灰色包围盒对准目标网格,点击Project mesh即可看到投影结果,例如把贴花精确打到模板场景的安全帽上:
常见问题与最佳实践
- 不要用 Legacy 的
Decal着色器:Legacy Shaders/Decal与本系统不兼容;DecalOverlayBounds、DecalThumbnail仅供编辑器 Inspector 使用(Editor/Resources/Shaders/)。 - 远距离/掠射角出现闪烁?调大
_OffsetViewZ,或修改Offset in viewspace子图的偏移算法。 - 运行时切换外观:修改
_Opacity、切换 DecalAsset 都很廉价,改动后调用贴花上的SetupMaterialPropertyBlock()生效;参考 DecalSpawner.cs 示例脚本。 - 投影完成后贴花即成"普通网格":不会跟随目标变形,不适合骨骼动画目标;运行时动态投影会造成掉帧,适合静态场景细节。
- 完整属性说明与进阶技巧见官方文档 Documentation~/DrivenDecals.md 的Custom Shaders章节。
小结
Driven Decals 把"投影"与"渲染"解耦:网格投影负责形状,Shader Graph 着色器负责外观。吃透 5 个子图(Decal UV、两个 Fade、Flip normal、Offset in viewspace)和 12 个属性后,你就可以复制任意内置着色器,几分钟内造出专属的 PBR 贴花材质 🚀。
【免费下载链接】driven-decalsA mesh-based PBR decal system for Unity's universal render pipeline.项目地址: https://gitcode.com/gh_mirrors/dr/driven-decals
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考