DreamShaderLang
示例

配方

可组合的 DreamShaderLang 材质片段。

时间脉冲

Graph = {
    float t = UE.Time();
    float pulse = UE.Expression(
        Class="Sine",
        OutputType="float1",
        Input=t);

    Color = Tint * (pulse * 0.5 + 0.5);
}

UV 平移

Graph = {
    vec2 uv = UE.TexCoord(Index=0);
    float t = UE.Time();
    vec2 moved = UE.Panner(Coordinate=uv, Time=t, SpeedX=0.1, SpeedY=0.0);
}

条件着色

Graph = {
    vec2 uv = UE.TexCoord(Index=0);
    float mask = UE.Expression(
        Class="ComponentMask",
        OutputType="float1",
        Input=uv,
        R=true);

    if (mask > 0.5) {
        Color = vec3(1.0, 0.2, 0.2);
    } else {
        Color = vec3(0.0, 0.0, 0.0);
    }
}

透明 UI 材质

Shader(Name="DreamMaterials/M_UI_Transparent")
{
    Properties = {
        vec3 Tint = vec3(1.0, 1.0, 1.0);
        float Alpha = 0.75;
    }

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

    Outputs = {
        vec3 Color;
        float OpacityValue;

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

    Graph = {
        Color = Tint;
        OpacityValue = Alpha;
    }
}

Surface PBR 骨架

Shader(Name="DreamMaterials/M_Surface_PBR")
{
    Properties = {
        vec3 BaseTint = vec3(0.8, 0.6, 0.4);
        float Rough = 0.5;
        float Metal = 0.0;
    }

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

    Outputs = {
        vec3 Base;
        float RoughnessValue;
        float MetallicValue;

        Base.BaseColor = Base;
        Base.Roughness = RoughnessValue;
        Base.Metallic = MetallicValue;
    }

    Graph = {
        Base = BaseTint;
        RoughnessValue = Rough;
        MetallicValue = Metal;
    }
}

参数分组与排序

Properties = {
    VectorParameter BaseColor = float4(0.8, 0.6, 0.4, 1.0) [
        Group="Surface";
        SortPriority=10;
        Description="Base material color";
    ];
    ScalarParameter Roughness = 0.5 [
        Group="Surface";
        SortPriority=20;
    ];
    ScalarParameter Metallic = 0.0 [
        Group="Surface";
        SortPriority=30;
    ];
}

Static Switch 分支

Shader(Name="DreamMaterials/M_StaticSwitch")
{
    Properties = {
        VectorParameter BaseColor = float4(0.1, 0.2, 0.3, 1.0) [
            Group="Surface";
            SortPriority=10;
        ];
        VectorParameter DetailColor = float4(1.0, 0.8, 0.3, 1.0) [
            Group="Surface";
            SortPriority=20;
        ];
        StaticSwitchParameter UseDetail = true [
            Group="Switches";
            SortPriority=30;
        ];
    }

    Outputs = {
        float3 Color;
        Base.BaseColor = Color;
    }

    Graph = {
        Color = UseDetail(True=DetailColor.rgb, False=BaseColor.rgb);
    }
}

Material Parameter Collection

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

    Color = Tint * windStrength;
}

可选材质函数输入

推荐放在 .dsf 函数文件中,例如 DShader/Functions/F_DebugColor.dsf

ShaderFunction(Name="Functions/F_DebugColor")
{
    Inputs = {
        float3 InColor;
        opt float4 ColorA = float4(0.3, 0.3, 0.7, 0.7) [
            Description="Preview color A";
        ];
        opt float4 ColorB = float4(0.0, 0.35, 1.0, 0.65) [
            Description="Preview color B";
        ];
    }

    Outputs = {
        float3 Result;
    }

    Graph = {
        Result = InColor;
    }
}

调用时可以传 default 跳过可选输入:

Graph = {
    float3 debug = F_DebugColor(BaseColor, default, default, Output="Result");
}

自定义 MaterialExpression 输出

Graph = {
    vec2 uv = UE.TexCoord(Index=0);
    float r = UE.Expression(
        Class="ComponentMask",
        OutputType="float1",
        Input=uv,
        R=true);

    Color = vec3(r, r, r);
}

多输出 helper

Function SplitBrightness(in vec3 color, out vec3 normalized, out float brightness) {
    brightness = max(max(color.r, color.g), color.b);
    normalized = color / max(brightness, 0.0001);
}

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

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

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

    Graph = {
        vec3 normalized;
        float brightness;

        SplitBrightness(Tint, normalized, brightness);
        Color = normalized * brightness;
    }
}

本页目录