DreamShaderLang
快速开始

关于 DreamShader

这个插件是什么、包含哪四个模块、支持哪些引擎,以及相关仓库在哪里。

DreamShader 是一个 Unreal Engine 插件,把 DreamShaderLang 源文件编译成标准材质资产。DreamShaderLang 是语言;解析、生成、缓存、诊断、反编译和编辑器集成都由插件负责。

版本2.0.0 —— 描述文件 Version 200,IsBetaVersion 为 false
引擎Unreal Engine 5.3 – 5.8,Win64 —— 2.0.0 实际对哪些引擎验证过见引擎支持
模块DreamShaderLang(Runtime)、DreamShader(Runtime)、DreamShaderCompiler(Editor)、DreamShaderEditor(Editor)
插件依赖WebSocketNetworking、SQLiteCore
描述文件标志EnabledByDefault、CanContainContent
许可证MIT
仓库TypeDreamMoon/DreamShader

解决什么问题

Unreal 材质图一旦变大,就很难 review、diff、复用和迁移。DreamShader 把其中可重复的部分搬进文本:

痛点处理方式
大图难以 review 和 diff图的结构存在 .dsm / .dsf 文件里
共享逻辑被反复复制.dsh header、.dsf 函数资产、Function / GraphFunction helper、Package
重新生成材质函数会让调用方断线FunctionInput / FunctionOutput 的 pin 身份按名字保留
Substrate 图需要文本化编写Substrate 类型、Base.FrontMaterial,以及 Substrate.* 内置 since UE 5.4
已有的图需要迁移反编译器把 UMaterial / UMaterialFunction 导出回 .dsm / .dsf
生成的资产追溯不到来源DreamShader.SourceFile 和 DreamShader.SourceHash 写进 package 元数据
一次重建把手改的资产悄悄覆盖了输出指纹 DreamShader.OutputDigest 拦下这次重建,并给出 Revert / Adopt / Detach since 1.8.0
插件想自带自己的材质源码每个带 DShader 目录的已启用插件贡献一个源码根 since 1.6.0
图里想写真正的表达式和控制流.dss:带声明的 HLSL,一个 export 一个资产 since 2.0.0
材质实例只能在面板里一项项勾.dsi:父材质和覆盖项写成文本 since 2.0.0

它不是材质编辑器的替代品,也不是 shader 管线。Graph 是一个只有四个运算符和 if / else 的节点图 构建器;真正命令式的逻辑应该写进 Function,它的函数体是真正的 HLSL,会被编译进 Custom 节点。一次性 的、非常视觉化的图,在 Unreal 里直接连更快 —— 等它稳定下来再导出成源文件也不迟。

四个模块

模块类型公开头文件职责
DreamShaderLang since 2.0.0Runtime27语言本身,只依赖 Core:词法、两套解析器(2.0 与 1.x 前端)、预处理器、绑定器、与引擎无关的图 IR、从 IR 回到源码的路径,以及 1.x → 2.0 迁移器。
DreamShaderRuntime8日志类别、规范化路径 helper、1.x 源码数据模型、define 表的引擎一侧、UDreamShaderSettings、UDreamShaderMaterialInstance、引擎版本宏,以及编译接口 IDreamShaderCompiler。
DreamShaderCompilerEditor19编译器的后半段:编译管线、IR 发射器、资产层、从反射读出的内置目录、产物索引、.dsi 的父材质 schema。1.9.x 及以前它是只含接口的 Runtime 模块。
DreamShaderEditorEditor0用户碰得到的一切:反编译器、dsc migrate、commandlet、桥接、预览、Material Content Browser、来源追溯操作、workspace 导出。

DreamShaderLang 和 DreamShader 在 PostConfigInit 阶段加载,早到设置对象和 shader 目录映射在任何人来要之前 就已就位;两个 Editor 模块在 Default 阶段加载。

DreamShaderEditor 不导出任何符号,也无法被链接 —— 它根本没有 Public/ 目录。受支持的 C++ 入口是 IDreamShaderCompiler:声明在 DreamShader(DreamShaderCompilerInterface.h),通过 GetDreamShaderCompiler() 拿到,由 DreamShaderCompiler 实现。其余能力只能通过编辑器 UI、commandlet 或桥接文件访问。

语言本身与引擎无关:DreamShaderLang 只依赖 Core,不创建 UObject,不加载资产。生成则相反 —— 仅编辑器、 仅游戏线程,构建在材质编辑库之上。

引擎支持

2.0.0 已用单插件 RunUAT BuildPlugin 在 Win64 上对 5.5、5.6 和 5.8 验证。5.7 最后一次验证是在 1.8.0:2.0 新加的每个引擎开关都直接问引擎自己的头文件或类型,而不是看版本号,所以 5.7 不需要单独的答案。 5.3 和 5.4 源码兼容,但新版 MSVC 工具链根本编不过这两个引擎 —— 失败发生在引擎头文件里,还没轮到插件代码。

功能可用性随版本不同,而且这些开关都是编译期的 —— 针对 5.3 编译出来的二进制里根本不包含 Substrate 代码路径,所以 把项目升级到新引擎意味着要重新编译插件。

需要功能
5.4Substrate —— Substrate.*、ShadingModel="Substrate"、Base.FrontMaterial、Strata 别名 · 生成的 Custom 节点默认折叠代码 · bHasPixelAnimation 的重置与导出
5.5periodicworld transform 基准 · UE.TransformPosition(PeriodicWorldTileSize=…)
5.6firstperson 系列 transform 基准 · UE.TransformPosition(FirstPersonInterpolationAlpha=…) · Root= 和 Path(…) 的插件挂载校验 · TextureSample.GatherMode 往返
5.7Collection 参数上的 Group / SortPriority · Layer Blend 输入的 BlendInputRelevance · 按平台、按质量等级的材质资源诊断
5.8 —— 按引擎自己的头文件判断,所以带了这些成员的 5.7 也能用.dsi 对参数集合参数的覆盖 · ThinCustom 实例回写保留下来的 double vector 与 static component mask 覆盖

未列出的功能在 5.3 到 5.8 上行为一致。功能缺失时,绝大多数源码可达的入口会给出以 requires Unreal Engine 5.4 or newer. 结尾的明确报错,而不是静默降级。

各部分由谁实现

DreamShader 实际上是两个独立产品,通过 <Project>/Saved/DreamShader/Bridge/ 下的文件和一个本地回环 WebSocket 通信。

能力由谁实现
解析、生成、缓存、诊断、反编译Unreal 插件
菜单、工具栏、右键菜单、Material Content Browser 标签页Unreal 插件
预览渲染和 PNG 帧Unreal 插件
DShader/Packages 创建、import 解析、编译排除规则Unreal 插件
高亮、补全、Hover、跳转、本地诊断编辑器扩展
预览的相机控制与帧确认编辑器扩展
dreamshader.package.json、dreamshader.lock.json、安装 / 更新 / 商店编辑器扩展

插件的 C++ 从不读取这两个 Package 文件。一个 Package 之所以能被解析,仅仅因为它的文件在 DShader/Packages 下。

仓库

问题反馈到插件仓库的 issue tracker。扩展自身的设置、命令和 Package 商店记录在扩展仓库里,不在这里。

下一步

本页目录