DreamShaderLang
插件参考

参数

参数

参数

DreamShader » 参数

参数是一种 Properties 声明,在生成的资源中会成为命名的 UMaterialExpression 节点——可以是实例能够覆盖的材质参数、常量,或内置输入节点。

声明位置.dsm、.dsf —— 即 Shader、ShaderFunction、ShaderLayer 或 ShaderLayerBlend 的 Properties 部分
类别参数类型目录
生成主体每读取一个属性就生成一个节点;没有任何读取的属性则不生成任何节点(DSH4390,信息)。在使用处展开的参数节点类型(参见参数节点标记)会为每个不同的使用各生成一个节点。节点位置来自图布局。
起始版本1.2.3(显式 *Parameter 标记)、1.2.6(const)、1.5.0(Group(…) { … }、Slider(…))

概要

[const] <type-token> <name> [ = <default-value> ] [ [ <metadata-entry> { ; | , } … ] ] ;

元数据块外层的 [ … ] 是字面 DreamShaderLang 标点;= <default-value> 周围的 [ … ] 以及整个元数据块周围的是“可选”元方括号。换句话说,带元数据的声明写作 float A = 1.0 [Group="X"];。

外层节语法——Properties 可以出现的位置、{ 之前可选的 =、重复、Group("Name") { … } 作用域以及排序规则——在属性(节)中规定。本节仅记录可以出现在 <type-token>、<default-value> 和 <metadata-entry> 槽位中的内容。

自 2.0.0 起,1.x 源由旧版前端读取,它会将每个属性转换为 2.0 语言为其书写的形式:一个 uniform、一个 static const,或在其被读取处构建的参数节点。.dss 的写法见2.0 语言;dsc migrate 会为你书写(Migrate)。

四种类型标记

类别数量示例生成的节点参考
紧凑标量7float Strength = 1.0;UMaterialExpressionScalarParameter紧凑类型标记
紧凑向量27vec3 Tint = vec3(1, 1, 1);UMaterialExpressionVectorParameter紧凑类型标记
紧凑纹理5Texture2D Base = Path(Game, "T_X");UMaterialExpressionTextureObjectParameter紧凑类型标记
显式 *Parameter 节点22,其中 15 个可构建TextureSampleParameter2D Tex;命名的 UMaterialExpression 子类参数节点标记
UE.<Name> 内置—UE.TexCoord(Index = 0) UV;该内置的节点,或反射类UE 内置

每个标记都不区分大小写匹配。不匹配以上任何一项的标记是DSH3252;七种没有 2.0 写法的参数节点类型之一则是DSH3253 (自 2.0.0 起)。

应使用哪种形式

目标写法原因
美术师可在实例上调整的浮点数float、half、int、uint、bool(或 ScalarParameter)全部七种紧凑标量标记与 ScalarParameter 都会生成完全相同的 ScalarParameter 节点
颜色或 2/3/4 分量参数float2 … bvec4声明的分量数量控制 Graph 读取哪个输出(RG / RGB / RGBA)
必须始终按 RGBA 读取的四分量参数VectorParameter固定为 4 个分量,无论其如何使用
着色器自行采样的纹理Texture2D / TextureCube / Texture2DArray / Texture3D / VolumeTexture生成该维度的纹理对象参数
带采样器节点且采样可配置的纹理TextureSampleParameter2D 及类似项拥有 Coordinates 和 mip 引脚;接受 SamplerType / MipValueMode 元数据
无固定维度的纹理对象TextureObjectParameter从所赋默认资源获取其维度 (自 1.6.0 起)
编译期分支StaticSwitchParameter必须以调用形式 N(True = …, False = …) 使用
无分支的编译期布尔值StaticBoolParameter仅值
美术师不得更改的烘焙值const <compact-token>生成 Constant / Constant2Vector / Constant3Vector / Constant4Vector / TextureObject —— 无参数、无实例覆盖
引擎馈送的节点(UV、时间、相机、顶点色、MPC)UE.<Name>( … )参见 UE 内置
任何其他 UMaterialExpression 类UE.<Class>(OutputType = "float4", … )通用反射式构建 —— 参见 UE.Expression

[!NOTE] const 与 39 种紧凑标记一起使用是合法的,并且 (自 2.0.0 起) 与 ScalarParameter、 VectorParameter 和 TextureObjectParameter 一起使用也是合法的,此时它们会构建与 const float、 const float4 和 const Texture2D 相同的常量。在任何其他 *Parameter 标记上则是 DSH3253。在 UE.* 声明上,const 会被忽略 (自 2.0.0 起)。

页面

页面涵盖内容
紧凑类型标记全部 39 种紧凑标记、各自生成的节点、默认值语法,以及在 Properties 中无效的标记
参数节点标记全部 22 种显式 *Parameter 标记、其生成的类、按类型划分的默认值与元数据槽位
元数据块[ Key = Value ; … ]、Slider(min, max)、ParameterName 以及反射式 UPROPERTY 透传
SamplerType每个 SamplerType 值及其拼写、SamplerSource,以及纹理维度如何被检查或推断
在图(Graph)中使用参数值读取、分量选择以及引脚调用形式 —— 附带引脚表
Path(…) 资源引用每种根拼写、解析器及其诊断

附注

  • 每种类型的默认值都是可选的。 没有 = <default> 时,标量为 0,向量在每个通道中为 0(对于 2 分量或 3 分量 token,alpha 为 1),纹理为该维度下引擎的默认 纹理 (自 2.0.0 起;1.x 会将向量保留为节点自身的默认值)。 Texture2DArray 没有引擎默认值:其节点保留类的 2D 默认纹理,且没有 诊断 (自 2.0.0 起)。请指定一个数组资产。
  • 属性名是标识符 (自 2.0.0 起)。float 1Bad = 0; 是 DSH2105(格式错误的数字)以及 DSH3250。
  • 成为声明的属性在文件作用域内声明 (自 2.0.0 起)。同一名称的两个属性——无论是在同一个块中, 还是在同一文件的两个块中——都会产生 DSH4210。名称按精确方式比较。1.x 中关于 函数的属性不得与其某个输入同名这一规则,在 2.0 中没有对应检查。
  • 声明顺序不约束读取。 Graph 可以读取声明在块中更靠后位置的 属性。例外是 UE.* 属性:它是在每个读取它的函数体头部声明的局部变量, 按 Properties 顺序排列,因此若某个参数命名了另一个 UE.* 属性,该属性需要在 列表中更早出现并由同一个函数体读取;否则该名称就是未声明的 (DSH4200)。
  • Properties 在 VirtualFunction 内部含义不同:在那里它是 Inputs 的同义词, 采用类型化参数语法,而非本语法。请参见 VirtualFunction。
  • 写入材质的参数名是所声明的名称,除非 [ParameterName="…"] 覆盖它。请参见 Metadata。

诊断

代码触发条件
DSH3250语句不以类型和名称开头、名称缺失,或属性后没有 ;;仅包含一个 [ … ] 块的语句也会触发此项
DSH3251const 后没有类型
DSH3252类型 token 不是紧凑 token,不是 *Parameter token,且不以 UE. 开头
DSH3253*Parameter token 没有 2.0 写法,或在不能作为常量的 *Parameter token 上使用了 const
DSH3254= 后没有默认值,或该 token 无法采用的默认值
DSH3259UE.* 声明带有未闭合的 (,或其名称后带有默认值
DSH3260Group("") { … }
DSH4210同一文件中有两个同名属性
DSH8214发射器无法创建参数节点(内部错误)

元数据、默认值和资产引用诊断位于 Metadata、 紧凑类型 token 和 Path(…)。完整 列表见诊断索引。

示例

Shader(Name="Docs/M_Parameters")
{
    Properties = {
        const float DebugScale = 1.0;                     // Constant, not overridable

        Group("Surface") {
            vec3  Tint      = vec3(1.0, 0.5, 0.2);        // VectorParameter, reads RGB
            float Roughness = 0.4 [Slider(0, 1)];         // ScalarParameter with a UI range
        }

        TextureSampleParameter2D BaseTex = Path(Game, "Textures/T_White") [
            SamplerType  = "LinearColor";
            MipValueMode = "None";
        ];

        StaticSwitchParameter UseDetail = true;

        UE.TexCoord(Index = 0) UV;                        // MaterialExpressionTextureCoordinate
    }

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

    Outputs = {
        vec3  Color;
        float Rough;

        Base.BaseColor  = Color;
        Base.Roughness  = Rough;
    }

    Graph = {
        vec4 Sample = BaseTex(Coordinates = UV);
        vec3 Lit    = Sample.rgb * Tint * DebugScale;
        Color = UseDetail(True = Lit, False = Tint);
        Rough = Roughness;
    }
}

生成的节点:

Constant              DebugScale        (const -> not a parameter)
VectorParameter       Tint              Group="Surface" SortPriority=0
ScalarParameter       Roughness         Group="Surface" SortPriority=10 SliderMin=0 SliderMax=1
TextureSampleParameter2D BaseTex        SamplerType=LinearColor
StaticSwitchParameter UseDetail
TextureCoordinate     UV                CoordinateIndex=0

另请参见

本页目录