DreamShaderLang

概览

DreamShaderLang 是虚幻引擎材质的文本化语言,由 DreamShader 插件编译成标准材质资产。

DreamShaderLang 是虚幻引擎材质的文本化语言。你写 .dsm.dsf.dsh 文件,DreamShader 插件在编辑器里解析它们,生成标准 Unreal 资产 —— UMaterialUMaterialFunctionUMaterialFunctionMaterialLayerUMaterialFunctionMaterialLayerBlend

源文件才是你维护的东西。资产是生成产物,随时可以删掉重新生成。

插件版本1.5.0
引擎Unreal Engine 5.35.8,已在 Win64 验证
模块DreamShader(Runtime)、DreamShaderCompiler(Runtime)、DreamShaderEditor(Editor)
源文件扩展名.dsm · .dsf · .dsh
项目设置Project Settings ▸ DreamPlugin ▸ Dream Shader
许可证MIT

三种源文件

扩展名名称可以写什么生成什么
.dsmDream Shader Material最多一个 Shader,以及任意函数、Layer、Namespace、VirtualFunction 块材质本体,加上同文件中声明的所有函数资产
.dsfDream Shader FunctionShaderFunctionShaderLayerShaderLayerBlend 和 helper 块,不能写 Shader它声明的函数资产
.dshDream Shader HeaderFunctionGraphFunctionNamespaceVirtualFunction、import不直接生成资产,通过 import 被使用

解析前 import 会被递归内联成一整段文本,所以一个编译单元是整个 import 闭包,而不是单个文件。 "一个文件只能有一个 Shader" 实际上是"一个闭包只能有一个 Shader"。参见 文件模型

各个块生成什么

Unreal 资产
ShaderUDreamShaderMaterialInstance 加一个隐藏的 UMaterial base(ThinCustom,默认),或一个普通 UMaterialGraph backend)
ShaderFunctionUMaterialFunction
ShaderLayerUMaterialFunctionMaterialLayer
ShaderLayerBlendUMaterialFunctionMaterialLayerBlend
VirtualFunction不生成资产 —— 只是声明一个已有的 UMaterialFunction,让 Graph 可以调用
Function / GraphFunctionCustom 节点代码,以及一个生成的 .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 及以上编译的 —— 这是 编译期开关。
  • 有些写法已经废弃。 包括 Instance backend 取值,以及 MaterialLayer / MaterialLayerBlend 这两种块写法。

从哪里开始

本页目录