DreamShaderLang
语言核心

文件模型

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

DreamShaderLang 使用两类源文件:.dsm 负责生成资产,.dsh 负责共享代码。解析器会把一个入口 .dsm 和它 import 的 .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推荐,可放在独立 .dsm
Function可以,但复用逻辑更推荐放 .dsh
Namespace可以,但共享 namespace 更推荐放 .dsh
import推荐,用于引入 .dsh 或 Package。

当前一个 .dsm 中只支持一个顶层 Shader。同一个文件可以同时声明共享 FunctionShaderFunction,但从维护性看,建议按资产拆文件。

.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。
Namespace一组 helper。

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

顶层块

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

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

ShaderShaderFunction 使用属性列表:

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
Function
Namespace
Properties
Settings
Outputs
Graph

On this page