概览
DreamShaderLang 是虚幻引擎材质的文本化语言,由 DreamShader 插件编译成标准材质资产。
DreamShaderLang 是虚幻引擎材质的文本化语言。你写 .dsm、.dsf 和 .dsh 文件,DreamShader
插件在编辑器里解析它们,生成标准 Unreal 资产 —— UMaterial、UMaterialFunction、
UMaterialFunctionMaterialLayer 和 UMaterialFunctionMaterialLayerBlend。
源文件才是你维护的东西。资产是生成产物,随时可以删掉重新生成。
| 插件版本 | 1.5.0 |
| 引擎 | Unreal Engine 5.3 – 5.8,已在 Win64 验证 |
| 模块 | DreamShader(Runtime)、DreamShaderCompiler(Runtime)、DreamShaderEditor(Editor) |
| 源文件扩展名 | .dsm · .dsf · .dsh |
| 项目设置 | Project Settings ▸ DreamPlugin ▸ Dream Shader |
| 许可证 | MIT |
三种源文件
| 扩展名 | 名称 | 可以写什么 | 生成什么 |
|---|---|---|---|
.dsm | Dream Shader Material | 最多一个 Shader,以及任意函数、Layer、Namespace、VirtualFunction 块 | 材质本体,加上同文件中声明的所有函数资产 |
.dsf | Dream Shader Function | ShaderFunction、ShaderLayer、ShaderLayerBlend 和 helper 块,不能写 Shader | 它声明的函数资产 |
.dsh | Dream Shader Header | Function、GraphFunction、Namespace、VirtualFunction、import | 不直接生成资产,通过 import 被使用 |
解析前 import 会被递归内联成一整段文本,所以一个编译单元是整个 import 闭包,而不是单个文件。
"一个文件只能有一个 Shader" 实际上是"一个闭包只能有一个 Shader"。参见
文件模型。
各个块生成什么
| 块 | Unreal 资产 |
|---|---|
Shader | UDreamShaderMaterialInstance 加一个隐藏的 UMaterial base(ThinCustom,默认),或一个普通 UMaterial(Graph backend) |
ShaderFunction | UMaterialFunction |
ShaderLayer | UMaterialFunctionMaterialLayer |
ShaderLayerBlend | UMaterialFunctionMaterialLayerBlend |
VirtualFunction | 不生成资产 —— 只是声明一个已有的 UMaterialFunction,让 Graph 可以调用 |
Function / GraphFunction | Custom 节点代码,以及一个生成的 .ush helper include |
最小材质
Shader(Name="DreamMaterials/M_Minimal")
{
Properties = {
vec3 Tint = vec3(1.0, 0.2, 0.2);
}
Settings = {
Domain = "UI";
ShadingModel = "Unlit";
}
Outputs = {
vec3 Color;
Base.EmissiveColor = Color;
}
Graph = {
Color = Tint;
}
}把这个文件保存在 DShader/ 下,就会生成 /Game/DreamMaterials/M_Minimal。
在默认的 ThinCustom backend 下,生成的材质只存在于内存中,不会出现在 Content Browser 里。
这是刻意设计的,有三种方式可以找到它 —— 见第一个材质。
DreamShader 做什么,不做什么
它在 Unreal 编辑器里生成材质资产,范围仅此而已。具体来说:
Graph是节点图构建器,不是着色器编译器。 它只有四个算术运算符和if/else。没有循环、 没有三元运算符、没有%、if条件之外没有位运算和比较运算符、没有矩阵、没有数组和下标、没有复合 赋值。其中不少写法不会报错,而是被静默截断 —— 写第一个稍复杂的图之前,请先读 不支持的写法。真正需要命令式代码的地方应该写进Function,它的函数体 是真正的 HLSL。- 生成只发生在编辑器里。 没有任何运行时路径能从 DreamShaderLang 构建材质,打包后的游戏里也不存在 这些工具。
- 生成的资产是产物,不是文档。 重新生成会拆掉整张图再重建,手动改动会丢失;直接在生成的实例上设置的 参数覆盖每次重建都会被清空。见重新生成。
Substrate.*需要 since UE 5.4,而且插件二进制必须是针对 5.4 及以上编译的 —— 这是 编译期开关。- 有些写法已经废弃。 包括
Instancebackend 取值,以及MaterialLayer/MaterialLayerBlend这两种块写法。
从哪里开始
快速开始
安装插件、生成第一个材质,并理解日常的保存 - 编译循环。
语言核心
源文件、词法规则、顶层块、Section、类型、函数、import、布局。
Graph 语言
语句、表达式、类型转换、if / else、调用,以及 Graph 不能做什么。
内置节点
UE.* 目录、通用逃生舱 UE.Expression、数学内置、Substrate.*。
参数
Properties 类型、参数节点、元数据与分组、资产引用。
设置
材质 Settings 与枚举取值、Backend,以及全部十三项项目设置。
生成与产物
生成流程、资产路径、内存材质、输出绑定、重新生成。
工具链
编辑器工具、反编译导出、VSCode 与 Rider、命令行 commandlet、Package。
诊断
所有错误和警告的成因与修复方式,以及当前限制。
示例
常用写法和可以直接复制的完整示例。
HLSL / GLSL 背景
DreamShaderLang 借鉴的两种着色语言的背景知识。
更新日志
插件、VSCode 扩展和网站的版本记录。