DreamShaderLang
语言核心

文件模型

.dsm、.dsf、.dsh、顶层块和 import 的基本规则。

DreamShaderLang 使用三类源文件:.dsm 负责材质和资产入口,.dsf 负责可复用生成函数,.dsh 负责共享 helper 和声明。解析器会把入口文件和它 import 的 .dsf / .dsh 合并成一次编译上下文。

.dsm

.dsm 是 Dream Shader Material 文件。它可以包含:

import "Shared/Common.dsh";

Function Helper(in float x, out float result) {
    result = x * x;
}

Shader(Name="DreamMaterials/M_Example")
{
    Properties = {}
    Outputs = {
        float Value;
        Base.EmissiveColor = float3(Value, Value, Value);
    }
    Graph = {
        Helper(1.0, Value);
    }
}

常见用途:

顶层块是否推荐放在 .dsm
Shader推荐。
ShaderFunction可以;更推荐放在独立 .dsf
ShaderLayer推荐,可放在独立 .dsm
ShaderLayerBlend推荐,可放在独立 .dsm
VirtualFunction可以,用于声明已有材质函数资产。
Function可以,但复用逻辑更推荐放 .dsh
GraphFunction可以,但复用逻辑更推荐放 .dsh
Namespace可以,但共享 namespace 更推荐放 .dsh
import推荐,用于引入 .dsf.dsh 或 Package。

当前一个 .dsm 中只建议放一个主要生成资产声明,例如一个 ShaderShaderLayerShaderLayerBlendShaderFunction 更推荐拆到 .dsf。同一个文件可以同时声明共享 helper,但从维护性看,建议按资产拆文件。

.dsf

.dsf 是 Dream Shader Function 文件。它适合放可复用的生成函数资产,以及这个函数需要的局部 helper:

ShaderFunction(Name="Functions/F_PulseTint")
{
    Inputs = {
        vec3 Color;
        vec3 Tint;
        float Pulse;
        opt float Strength = 1.0;
    }

    Outputs = {
        vec3 OutColor;
        float OutMask;
    }

    Graph = {
        OutMask = saturate(Pulse * Strength);
        OutColor = Color * Tint * OutMask;
    }
}

推荐只放:

顶层块用途
ShaderFunction生成可复用 UMaterialFunction
Function该函数文件内或被导入后可用的 HLSL helper。
GraphFunction可复用 Custom 节点 helper。
Namespace一组 helper。
VirtualFunction声明已有 UMaterialFunction 签名。
import引入 .dsh、其他 .dsf 或 Package。

.dsf 不应包含 ShaderShaderLayerShaderLayerBlend。从 .dsm 导入 .dsf 后,可以在 Graph 中调用其中生成的 ShaderFunction

import "Functions/F_PulseTint.dsf";

Graph = {
    F_PulseTint(BaseColor.rgb, Tint, Pulse, Strength, Color, Mask);
}

.dsh

.dsh 是 Dream Shader Header 文件。它通常包含:

import "Shared/Math.dsh";

Namespace(Name="Color")
{
    Function ApplyTint(in vec3 color, in vec3 tint, out vec3 result) {
        result = color * tint;
    }
}

推荐只放:

顶层块用途
import复用其他 header 或 Package。
Function无 namespace 的共享 helper。
GraphFunction可复用 Custom 节点 helper,函数体中可使用 UE.* 图节点。
Namespace一组 helper。
VirtualFunction只声明已有 UMaterialFunction 签名,不直接生成资产。

.dsh 不直接生成 Shader / ShaderFunction 资产。保存 .dsh 后,DreamShader 会根据 import graph 找到依赖它的 .dsm / .dsf 并重编。

顶层块

一个源文件由若干顶层块组成:

import "..."
Shader(Name="...") { ... }
ShaderFunction(Name="...") { ... }
ShaderLayer(Name="...") { ... }
ShaderLayerBlend(Name="...") { ... }
VirtualFunction(Name="...") { ... }
Function [SelfContained|Inline] Name(...) { ... }
GraphFunction [SelfContained|Inline] Name(...) { ... }
Namespace(Name="...") { Function ... }

ShaderShaderFunctionShaderLayerShaderLayerBlend 使用属性列表:

Shader(Name="DreamMaterials/M_Name")
{
    ...
}

Function 使用 C/HLSL 风格签名:

Function Remap01(in float value, out float result) {
    result = saturate(value * 0.5 + 0.5);
}

注释

语言在 section 与 Graph 解析中支持常见注释:

// 行注释

/*
   块注释
*/

注释不会进入声明解析,但 Function 的函数体本身会作为 HLSL 风格代码保留。

大小写

大多数内置关键字、类型名、设置名和 Unreal 输出绑定以大小写不敏感方式解析。但建议保持文档中的大小写风格:

Shader
ShaderFunction
ShaderLayer
ShaderLayerBlend
VirtualFunction
Function
GraphFunction
Namespace
Properties
Settings
Outputs
Graph

本页目录