语言核心
Import 与 Namespace
组织共享 .dsh、Package 和命名空间函数。
import 和 Namespace 是 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 | 使用领域名:Texture、Color、Noise、SDF。 |
| 函数 | 使用动词或明确计算名:ApplyTint、BuildPulse、Sample2DRGB。 |
| Package namespace | 避免过短名称,减少与其他包冲突。 |