DreamShaderLang
语言核心

Import 与 Namespace

组织共享 .dsh、Package 和命名空间函数。

importNamespace 是 DreamShaderLang 的共享机制。前者把文件加入当前编译上下文,后者给 helper 函数分组。

Import 语法

import "Shared/Common.dsh";
import "@typedreammoon/dream-noise/Library/Noise.dsh";

import 通常写在文件顶部,也可以递归导入其他 .dsh

路径解析

路径形式解析位置
"Shared/Common.dsh"当前文件目录与项目 DShader 根目录。
"@scope/package/Library/File.dsh"项目 DShader/Packages

Package import 可以省略 .dsh

import "@typedreammoon/dream-noise/Library/Noise";

更完整的 Package 规则见 Package 参考

依赖图

DreamShader 会维护 import graph:

行为结果
保存 .dsm重编当前 .dsm
保存 .dsh只重编依赖该 .dsh.dsm
循环导入诊断为错误。
import 无法解析VSCode 与 Unreal 编译诊断都会提示。

Namespace 语法

Namespace(Name="Common")
{
    Function BuildPulse(in float t, in vec2 uv, out vec3 result) {
        vec2 p = uv - 0.5;
        float ring = sin(t * 2.0 + length(p) * 12.0) * 0.5 + 0.5;
        result = vec3(ring, ring * 0.5 + 0.1, 1.0 - ring * 0.35);
    }
}

调用:

Common::BuildPulse(Time, UV, Color);

Namespace 规则

项目规则
Name必填,必须是合法标识符。
内容只能包含 Function
嵌套 namespace当前不支持。
调用使用 Namespace::Function(...)

共享头文件模式

DShader/Shared/Common.dsh

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

DShader/Materials/M_Tinted.dsm

import "Shared/Common.dsh";

Shader(Name="DreamMaterials/M_Tinted")
{
    Properties = {
        vec3 Tint = vec3(1.0, 1.0, 1.0);
    }

    Settings = {
        Domain = "UI";
        ShadingModel = "Unlit";
    }

    Outputs = {
        vec3 Color;
        Base.EmissiveColor = Color;
    }

    Graph = {
        vec3 baseColor = vec3(0.7, 0.2, 1.0);
        Common::ApplyTint(baseColor, Tint, Color);
    }
}

命名建议

类型建议
Namespace使用领域名:TextureColorNoiseSDF
函数使用动词或明确计算名:ApplyTintBuildPulseSample2DRGB
Package namespace避免过短名称,减少与其他包冲突。

On this page