语言核心
文件模型
.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。同一个文件可以同时声明共享 Function 和 ShaderFunction,但从维护性看,建议按资产拆文件。
.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 ... }Shader 和 ShaderFunction 使用属性列表:
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