4.3 插件中的 Shader 与资源
插件带 Shader 的情况
三类插件需要自己的着色器:
- 自定义材质节点 / 材质表达式插件
- 渲染插件(后处理、自定义通道)
- 视觉效果插件
机制:UE 有「虚拟着色器路径」映射——插件的 Shader 目录可映射进着色器命名空间。具体见「插件中的 Shader」(https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/overview-of-shaders-in-plugins-4c05):
// 模块启动注册映射
FString ShaderDir = FPaths::Combine(FPaths::PluginDir("MyPlugin"), TEXT("Shaders"));
AddShaderSourceDirectoryMapping(TEXT("/Plugin/MyPlugin"), ShaderDir);
然后在 .usf 里 #include "/Plugin/MyPlugin/MyCommon.ush"。
需要知道的三件事
- Shader 重编译:改 .usf 后要触发编译(编辑器会自动检测变化;不行就
recompileshaders changed) - 平台多样性:Shader 要在目标平台(含移动端 GLES/Metal)编译过——用虚拟路径的工具一般依赖引擎自带跨编译器
- 版本兼容是硬伤:HLSL 源码级 API 在引擎大版本间可能变(如 Render Dependency Graph 的接口很新)。Shader 相关代码是最容易在升级时大改的地方
插件带的资源
插件可以带内容资源(图标、模板、示例资产、默认配置表),注意:
- CanContainContent=true 必须在 uplugin 里开启,不然没有 Content 目录
- 资源路径稳定:一旦发布,资源路径就是公开 API——移动资源会破坏用户项目里的引用
- 示例内容单独打 Sample 包(避免主插件被示例资产拖大)
推荐的资源组织
MyPlugin/
├── Content/
│ ├── Icons/ (菜单图标)
│ ├── Templates/ (模板资产)
│ └── Config/ (默认配置数据表)
├── Resources/ (Slate 图标 PNG/SVG)
└── Shaders/ (if 有 shader)
国际化(如果分发)
插件 UI 文案用 FText + NSLOCTEXT 命名空间(即使你不翻译)——给未来留口子,成本为零。
心得:带 Shader 的插件是另一个量级的复杂度。如果不是必须,工具类插件优先「绕开 GPU」:能用现有材质节点组合的、能用材质参数集的,别急着写自定义着色器。多数工具需求根本碰不到 Shader。
