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"。

需要知道的三件事

  1. Shader 重编译:改 .usf 后要触发编译(编辑器会自动检测变化;不行就 recompileshaders changed)
  2. 平台多样性:Shader 要在目标平台(含移动端 GLES/Metal)编译过——用虚拟路径的工具一般依赖引擎自带跨编译器
  3. 版本兼容是硬伤: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。