DreamShaderLang
语言核心

Section

Shader、ShaderFunction 与 VirtualFunction 内部 section 的语义。

ShaderShaderFunctionVirtualFunction 的主体由 section 组成。section 形式固定为:

SectionName = {
    ...
}

分号可写可不写,但建议统一省略 section 后的分号。

Properties

Properties 用在 Shader 中声明材质参数或来自 UE.* 的内置节点属性;也可以用在 ShaderFunction 中声明材质函数内部的 parameter/helper 节点。

Properties = {
    const float DebugScale = 1.0;
    const Texture2D PreviewTex;
    float Strength = 1.0;
    vec3 Tint = vec3(1.0, 0.8, 0.6);
    Texture2D MainTex = Path(Game, "/Textures/T_Main");
    ScalarParameter Roughness = 0.35 [
        Group="Surface";
        SortPriority=10;
        Description="Material roughness";
    ];
    StaticSwitchParameter UseDetail = true [
        Group="Switches";
        SortPriority=30;
    ];
}

生成器会为普通 property 创建参数节点:

类型生成节点
标量Scalar Parameter。
向量Vector Parameter。
纹理Texture Object Parameter。
UE.*对应 Unreal MaterialExpression。

在声明前加 const 会生成不可外部调参的常量/helper 节点,而不是 parameter 节点。const 支持标量、向量和纹理简写类型;const Texture2D 会生成 Texture Object,可用 = Path(...) 指定预览纹理,不写时使用 Unreal 默认纹理。

除了 float / vec3 / Texture2D 简写,也可以显式声明 Unreal 参数节点类型:

写法生成节点
ScalarParameterScalar Parameter。
VectorParameter / DoubleVectorParameterVector Parameter。
TextureObjectParameterTexture Object Parameter。
TextureSampleParameter2D / TextureSampleParameterCube / TextureSampleParameter2DArrayTexture Sample Parameter。
StaticBoolParameterStatic Bool Parameter。
StaticSwitchParameterStatic Switch Parameter。

声明尾部可追加分号式 [...] 反射属性块:

VectorParameter Tint = float4(1.0, 0.9, 0.8, 1.0) [
    Group="Surface";
    SortPriority=20;
    Description="Base tint";
];
属性说明
Group参数面板分组。
SortPriority参数排序优先级,整数。
Description节点说明,会写入 Unreal 节点 Desc

属性块会按 Unreal MaterialExpression 的 UPROPERTY 反射写入节点,因此 Texture Sample Parameter 也可以配置采样属性:

TextureSampleParameter2D MetallicMap = Path(Game, "Textures/T_White_Linear") [
    Group="11 - Specular";
    SortPriority=51;
    SamplerType="LinearColor";
    SamplerSource="FromTextureAsset";
    MipValueMode="None";
    AutomaticViewMipBias=true;
    ConstCoordinate=0;
    ConstMipValue=-1;
];

StaticSwitchParameter 可以在 Graph 中以同名函数形式连接 True / False 两个分支:

Graph = {
    float3 finalColor = UseDetail(True=detailColor, False=baseColor);
}

Inputs

Inputs 用在 ShaderFunction / VirtualFunction 中,声明材质函数输入 pin。

Inputs = {
    vec3 InColor;
    opt vec3 InTint = vec3(1.0, 1.0, 1.0) [
        Description="Preview tint";
    ];
    opt float Strength = 1.0 [
        SortPriority=10;
    ];
}

opt 表示该输入可选,并使用 Unreal Function Input 节点的预览值作为默认值。调用 ShaderFunction / VirtualFunction 时,可以传 default 显式跳过,也可以省略尾部可选输入:

float3 a = F_Tint(Color, default, Output="OutColor");
float3 b = F_Tint(Color, Output="OutColor");

ShaderFunction 中,Inputs 默认值可以引用同一函数 Properties 中声明的节点,常用于纹理预览:

Properties = {
    const Texture2D PreviewTex;
}

Inputs = {
    opt Texture2D BaseColorTex = PreviewTex;
}

Inputs / Outputs 支持属性块中的 SortPriorityDescriptionGroup 也会被解析并保留在语法层,但 Unreal Function Input / Output 节点本身没有分组字段。

旧版本曾把 ShaderFunction / VirtualFunctionProperties 当作 Inputs 兼容写法;从 1.2.6 起,ShaderFunction.Properties 是独立的 property/helper 节点区,输入 pin 应写在 Inputs

Outputs

Outputs 有两种语义。

Shader 中,它声明中间输出变量,并把变量绑定到 Unreal 材质属性或辅助输出节点:

Outputs = {
    vec3 Color;
    float Alpha;

    Base.EmissiveColor = Color;
    Base.Opacity = Alpha;
}

如果需要走 Unreal 的完整 Material Attributes 输入,可以声明聚合输出并绑定到 Base.MaterialAttributes

Outputs = {
    MaterialAttributes Attrs;
    Base.MaterialAttributes = Attrs;
}

ShaderFunction / VirtualFunction 中,它声明材质函数输出 pin:

Outputs = {
    vec3 OutColor;
    MaterialAttributes OutAttrs;
}

Outputs 也可在旧语义中写作 Results,但新文档统一使用 Outputs

Settings

Settings 配置 Unreal 材质或材质函数属性。

Settings = {
    Domain = "Surface";
    BlendMode = "Opaque";
    ShadingModel = "DefaultLit";
    TwoSided = true;
}

常用设置:

设置示例说明
Domain / MaterialDomain"UI"材质域。
BlendMode / RenderType"Translucent"混合模式。
ShadingModel"Unlit"Shading Model。
TwoSidedtrue双面渲染。
Wireframefalse线框渲染。
OpacityMaskClipValue0.3333Masked clip 阈值。

ShaderFunction 常见设置:

设置示例
Description"Tint helper"
ExposeToLibrarytrue
LibraryCategories"DreamShader,Color"

更多见 材质设置参考

Options

Options 用在 VirtualFunction 中,描述已有 UMaterialFunction 资产引用。

Options = {
    Asset = Path(Plugins.MoonToon, "MaterialFunctions/Buffer/Writer");
    Description = "Existing MoonToon material function";
}

Asset 必填,支持 GameEnginePlugin.PluginName / Plugins.PluginName 根路径,也可以写完整 Unreal object path。SettingsVirtualFunction 中作为兼容别名可用,但新代码推荐使用 Options

Graph

Graph 是 DreamShaderLang 的材质图 DSL。

Graph = {
    vec2 uv = UE.TexCoord(Index=0);
    float t = UE.Time();
    Color = vec3(t, t, t);
}

ShaderShaderFunction 都必须用 Graph 描述图。旧的 Code = { ... } 不再用于 ShaderShaderFunction

Graph 中新增的参数相关入口包括:

float wind = UE.CollectionParam(
    Collection=Path(Game, "Collections/MPC_Wind"),
    Parameter="WindStrength");

float3 finalColor = UE.StaticSwitchParameter(
    Name="UseDetail",
    Default=true,
    True=detailColor,
    False=baseColor);

Graph 中也可以使用 #Region / #EndRegion 对生成节点分组。区域信息会参与图布局,并可在 VSCode 中折叠:

Graph = {
    #Region "Surface"
    Color = BaseColor.rgb;
    RoughnessOut = saturate(Roughness);
    #EndRegion
}

Layout

Layout 是可选的材质图布局 metadata,用于显式记录生成节点位置和注释框。它不改变材质计算结果。

Layout = {
    Comment(Name="Surface", X=-400, Y=-260, W=1200, H=700, Color=float4(0.10, 0.16, 0.22, 0.35));
    Node(Var="BaseColor", X=-240, Y=-80);
}
语句必填参数作用
Node(...)VarXY固定某个 Graph 变量或生成节点的位置。
Comment(...)NameXYWH创建 Unreal 材质图注释框。

CommentColor=float4(...) 可选。反编译导出时,如果启用了布局导出,已有材质图注释和节点区域会尽量转换成 Layout 与 Graph region。

Section 支持矩阵

SectionShaderShaderFunctionVirtualFunction
Properties支持支持,声明函数内部 property/helper 节点可作为 Inputs 兼容写法
Inputs不支持支持支持
Outputs支持输出声明和绑定支持输出 pin支持输出 pin
Results不支持可作为 Outputs 兼容写法可作为 Outputs 兼容写法
Settings支持支持可作为 Options 兼容写法
Options不支持不支持支持
Graph必填支持不支持
Layout可选可选不支持
Code不支持不支持不支持

本页目录