Skip to content

Material部分

Material部分是一个材质定义必须的部分,它包含一个属性对列表来描述所有非着色器数据。

通用化参数

  • name: string类型,任意字符串,如果包含空格可以使用引号。设置材质的名称,往往用于运行时的调试。
material {
    name : stone
}

material {
    name : "Wet pavement"
}
  • featureLevel: int类型,只为1,2或3,默认是1。设置材质的特征级别。每个特征级别定义了一组材料可以使用的特征。如果材料使用了所选级别不支持的特性,则matc将在编译期间生成错误。给定的功能级别保证支持较低功能级别的所有功能。
Feature LevelGuaranteed features
19 textures per material
29 textures per material, cubemap arrays, ESSL 3.10
312 textures per material, cubemap arrays, ESSL 3.10
material {
    featureLevel : 2
}
  • shadingModel: 字符串类型,值为lit, subsurface, cloth, unlit, specularGlossiness,默认为lit。是材质模型的定义,具体参考这里
material {
    shadingModel : unlit
}
  • parameters: 类型是一个对象列表,每个条目都是一个对象,具有字符串类型的属性name和type。名称必须是有效的GLSL标识符。条目也有一个可选的精度,它可以是默认的(平台的最佳精度,通常是桌面高,移动中等),低,中,高。在运行时通过材质实例将渲染对象的实际材质参数值设置进去,在shader中通过一定的方式来进行访问,具体来说:
    • 采样器类型: 使用materialParams_开头,例如materialParams_myTexture
    • 其他类型: 使用materialParams.,例如materialParams.myColor
TypeDescription
boolSingle boolean
bool2Vector of 2 booleans
bool3Vector of 3 booleans
bool4Vector of 4 booleans
floatSingle float
float2Vector of 2 floats
float3Vector of 3 floats
float4Vector of 4 floats
intSingle integer
int2Vector of 2 integers
int3Vector of 3 integers
int4Vector of 4 integers
uintSingle unsigned integer
uint2Vector of 2 unsigned integers
uint3Vector of 3 unsigned integers
uint4Vector of 4 unsigned integers
float3x3Matrix of 3x3 floats
float4x4Matrix of 4x4 floats
sampler2d2D texture
sampler2dArrayArray of 2D textures
samplerExternalExternal texture (platform-specific)
samplerCubemapCubemap texture

示例如下:

material {
    parameters : [
        {
           type : float4,
           name : albedo
        },
        {
           type      : sampler2d,
           format    : float,
           precision : high,
           name      : roughness
        },
        {
            type : float2,
            name : metallicReflectance
        }
    ],
    requires : [
        uv0
    ],
    shadingModel : lit,
}

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        material.baseColor = materialParams.albedo;
        material.roughness = texture(materialParams_roughness, getUV0());
        material.metallic = materialParams.metallicReflectance.x;
        material.reflectance = materialParams.metallicReflectance.y;
    }
}

!!! Note: - 采样器类型还可以指定纹理格式,如int或者float - 数组类型需要在类型后面添加size参数,如float[9]

  • constants: 常量对象的数组,每个条目都是一个对象,具有字符串类型的属性name和type。名称必须是有效的GLSL标识符。条目也有一个可选的默认值,它可以是bool或数字,具体取决于常量的类型。类型必须是下表中的值。
TypeDescriptionDefault
intA signed, 32 bit GLSL int0
floatA single-precision GLSL float0.0
boolA GLSL boolfalse

列出材质中可接受的常数参数。这些常量可以在加载材料包时设置或“特化”。多个材料可以从相同的材料包加载不同的常数参数特化。一旦材料从材料包中加载,其常量参数就不能更改。与常规参数相比,常量参数允许编译器生成更高效的代码。通过在shader的名字前加上materialConstant_来访问常量参数。例如,一个名为myConstant的常量参数在着色器中被访问为materialConstant_myConstant。如果在运行时未设置常量参数,则使用默认值。

material {
    constants : [
        {
           name : overrideAlpha,
           type : bool
        },
        {
           name : customAlpha,
           type : float,
           default : 0.5
        }
    ],
    shadingModel : lit,
    blending : transparent,
}

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        if (materialConstants_overrideAlpha) {
            material.baseColor.a = materialConstants_customAlpha;
            material.baseColor.rgb *= material.baseColor.a;
        }
    }
}
  • variantFilter: 类型是字符串数据。变体过滤,用于减少编译产物的大小,用于指定应用程序保证永远不需要的着色器变体列表。这些着色器变量在代码生成阶段被跳过,从而减少了材料的整体尺寸。请注意,有些变体可能会自动被过滤掉。例如,所有照明相关的变量(directionalllighting等)在编译unlit材质时被过滤掉。谨慎使用变量过滤器,在运行时过滤掉所需的变量可能会导致崩溃。一些可能的值是:
    • directionalLighting, 方向光是否开启的变体
    • dynamicLighting, 动态光源(除方向光以外的其他光源)是否开启的变体
    • shadowReceiver, 是否接收阴影
    • skinning, 是否有骨骼动画
    • fog, 是否使用雾效
    • vsm, 是否使用协方差阴影
    • ssr, 是否使用屏幕空间反射
    • ...., 不断扩充中
material {
    name : "Invisible shadow plane",
    shadingModel : unlit,
    shadowMultiplier : true,
    blending : transparent,
    variantFilter : [ skinning ]
}
  • flipUV: 布尔类型,默认是true。当设置为true(默认值)时,当材质的顶点着色器读取UV属性的Y坐标时会翻转。翻转相当于y = 1.0 - y。当设置为false时,翻转被禁用,并按原样读取UV属性。
material {
    flipUV : false
}
  • quailty:string类型,值为low, normal, high, default其中之一,默认为default。设置材料的一些全局质量参数。Low允许稍微影响正确性的优化,并且是移动平台上的默认值。Normal不影响正确性,在其他方面类似于low。High启用可能对性能产生不利影响的质量设置,并且是桌面平台上的默认设置。
material {
    quality : default
}

顶点属性参数

  • requires:类型是string列表,列表中的每个元素的值是uv0, uv1, color, position, tangents, custom0~custom7其中之一。列出材质所需的顶点属性。position属性总是必需的,不需要指定。当选择任何非非照明的着色模型时,tangents属性是自动需要的。
material {
    parameters : [
        {
           type : sampler2d,
           name : texture
        },
    ],
    requires : [
        uv0,
        custom0
    ],
    shadingModel : lit,
}

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        material.baseColor = texture(materialParams_texture, getUV0());
        material.baseColor.rgb *= getCustom0().rgb;
    }
}
  • variables: 类型是string列表,最多定义4个变量,且变量的命名符合glsl约定的形式。定义由材质的顶点着色器输出的自定义插值(或变量)。数组的每一项都定义了一个插值器的名称。片段着色器中的全名是带有variable_前缀的插值器的名称。例如,如果你声明一个名为eyeDirection的变量,你可以使用variable_eyeDirection在片段着色器中访问它。在顶点着色器中,插值名称只是MaterialVertexInputs结构(material)的一个成员。eyeDirection(在你的例子中)。每个插值在着色器中都是float4 (vec4)类型。
material {
    name : Skybox,
    parameters : [
        {
           type : samplerCubemap,
           name : skybox
        }
    ],
    variables : [
         eyeDirection
    ],
    vertexDomain : device,
    depthWrite : false,
    shadingModel : unlit
}

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        float3 sky = texture(materialParams_skybox, variable_eyeDirection.xyz).rgb;
        material.baseColor = vec4(sky, 1.0);
    }
}

vertex {
    void materialVertex(inout MaterialVertexInputs material) {
        float3 p = getPosition().xyz;
        float3 u = mulMat4x4Float3(getViewFromClipMatrix(), p).xyz;
        material.eyeDirection.xyz = mulMat3x3Float3(getWorldFromViewMatrix(), u);
    }
}
  • vertexDomain: string类型,可选的值是: object, world, view, device,默认是object。定义渲染网格的域(或坐标空间)。域影响顶点着色器中顶点的转换方式。可能的域有:
    • object: 顶点在对象(或模型)坐标空间中定义。顶点使用渲染对象的变换矩阵进行变换
    • world: 顶点在世界坐标空间中定义。顶点不使用渲染对象的变换进行转换。
    • view: 顶点在视图(或眼睛或相机)坐标空间中定义。顶点不使用渲染对象的变换进行转换。
    • device: 顶点在标准化的设备(或剪辑)坐标空间中定义。顶点不使用渲染对象的变换进行转换。
material {
    vertexDomain : device
}
  • interpolation: string类型,可能的值是smooth, flat,默认smooth。定义如何在顶点之间插入插值(或变量)。当此属性设置为smooth时,将对每个插值执行透视正确的插值。当设置为平面时,不执行插值,并且给定三角形内的所有片段将被相同的阴影。
material {
    interpolation : flat
}

混合与透明

  • blending: string类型,可能的值是opaque, transparent, fade, add, masked, multiply, screen,默认是opaque。定义渲染对象如何/是否与渲染目标的内容混合。可能的混合模式有:

    • opaque:混合是禁用的,材料的输出的alpha通道被忽略。
    • transparent:混合是启用的。材料的输出是与渲染目标的alpha复合,使用波特-达夫的源覆盖规则。这种混合模式假设预乘alpha。
    • fade:作为透明但透明度也适用于镜面照明。在透明模式下,材料的alpha值只适用于漫反射照明。这种混合模式对于淡入淡出点亮的物体很有用。
    • add:混合是启用的。材料的输出被添加到渲染目标的内容。
    • masked:混合是启用的。材料的输出与渲染目标的内容相乘,使内容变暗。
    • screen:混合是启用的。有效地与乘法相反,渲染目标的内容被加亮。
    • masked:混合是禁用的。这种混合模式启用alpha掩蔽。材料的输出的alpha通道定义是否丢弃一个片段。此外,ALPHA_TO_COVERAGE为非透明视图启用。参见 maskThreshold 部分以获取更多信息。
material {
    blending : transparent
}
  • postLightingBlending: string类型,可能的值为opaque, transparent, add,默认为opaque。定义如何将postLightingColor材质属性与光照计算结果混合。可能的混合模式有:

    • Opaque: 混合被禁用,材质将直接输出postLightingColor。
    • Transparent: 启用混合。材质的计算颜色是与postLightingColor合成的alpha,使用Porter-Duff的source over规则。这种混合模式假定预先乘以alpha。
    • Add: 启用混合。材质的计算颜色被添加到postLightingColor。
    • Multiply: 启用混合。材质的计算颜色乘以postLightingColor。
    • Screen: 启用混合。材质的计算颜色被反转并与postLightingColor相乘,结果被添加到材质的计算颜色中。
material {
    postLightingBlending : add
}
  • transparency: string类型,可能的值为default, twoPassesOneSide以及twoPassesTwoSides,默认的值为default。控制透明对象的呈现方式。它仅在混合模式不是Opaque且refractionMode为none时有效。这些方法都不能准确地呈现凹形几何,但在实践中它们往往足够好。三种可能的透明度模式是:
    • default: 透明对象正常呈现,遵循剔除模式,等等。
    • twoPassesOneSide: 透明对象首先在深度缓冲区中渲染,然后再在颜色缓冲区中渲染,遵循剔除模式。这实际上只呈现了透明对象的一半。
    • twopassstwosides: 透明对象在颜色缓冲区中渲染两次:第一次渲染背面,然后渲染正面。该模式允许呈现两组面,同时减少或消除排序问题。twopassstwosides可以与doublesides结合使用,效果更好。
material {
    transparency : twoPassesOneSide
}
  • maskThreshold: number类型,值介于0到1之间,默认的值为0.4。设置最小alpha值,当混合模式设置为遮罩时,片段必须不被丢弃。如果片段没有被丢弃,则其源alpha被设置为1。当混合模式未被屏蔽时,此值将被忽略。此值可用于控制alpha遮罩对象的外观。
material {
    blending : masked,
    maskThreshold : 0.5
}
  • refractionMode: string类型,可能的值为none, cubemap, screenspace,默认为none。当设置为非none时激活折射。cubemap的值将只使用IBL cubemap作为折射源,而这是非常有效的,没有场景对象将被折射,只有在cubemap中编码的远处环境。这种模式对于对象查看器来说是足够的。屏幕空间的值将采用更先进的屏幕空间折射算法,该算法允许场景中不透明的物体被折射。在立方体映射模式中,假定折射光线从物体的中心发出,厚度参数仅用于计算吸收,而对折射本身没有影响。在屏幕空间模式下,假定折射光线在离开折射介质时平行于观看方向。
material {
    refractionMode : cubemap
}
  • refractionType: string类型,可能的值为solid, thin,默认为solid。这只有在refractionMode设置为非none时才有意义。refractionType定义使用的折射模型。Solid用于厚的物体,如水晶球、冰块或雕塑。Thin用于薄的物体,如窗户、装饰球或肥皂泡。在实体模式下,假定所有的折射物体都是与入射点相切且半径厚度的球体。在薄模式下,所有的折射率物体都被假定为平面的、薄的、厚度的。
material {
    refractionMode : cubemap,
    refractionType : thin,
}

光栅化

  • culling: string类型,可能的值是none, front, back, frontAndBack,默认的值是back。定义应该剔除哪些三角形:不剔除、正面三角形、背面三角形或全部剔除。
material {
    culling : none,
}
  • colorWrite: 布尔类型,默认是true。控制是否将颜色写入颜色缓冲区。
material {
    colorWrite : false,
}
  • depthWrite:布尔类型,对于非透明材质默认是true,对于透明材质默认是false。用于控制是否将深度信息写入深度缓冲区。
material {
    depthWrite : false
}
  • depthCulling: 布尔类型,默认是true。是否开启深度测试。当深度测试被禁用时,用此材质渲染的对象将始终出现在其他不透明对象的顶部。
material {
    depthCulling : false
}
  • doubleSided: 布尔类型,默认是false。启用双面呈现,并在运行时切换其功能。当设置为true时,剔除自动设置为none; 如果三角形是面向背面的,则三角形的法线将翻转为面向正面。当显式设置为false时,这允许在运行时切换双面性。
material {
    name : "Double sided material",
    shadingModel : lit,
    doubleSided : true
}

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        material.baseColor = materialParams.albedo;
    }
}
  • alphaToCoverage: 布尔类型,默认是false。启用或禁用alpha覆盖。当覆盖的alpha被启用时,片段的覆盖是从它的alpha派生出来的。此属性仅在启用MSAA时才有意义。注意:将混合设置为遮罩会自动启用alpha覆盖。如果您不希望这样做,您可以通过将alpha的覆盖率设置为false来覆盖此行为。
material {
    name : "Alpha to coverage",
    shadingModel : lit,
    blending : masked,
    alphaToCoverage : false
}

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        material.baseColor = materialParams.albedo;
    }
}

光照

  • reflections: string类型,可能的值为default或screenspace,默认为default。控制材质的镜面反射方式。当此属性设置为默认值时,反射仅来自基于图像的光。当此属性设置为屏幕空间时,除了基于图像的光线之外,反射还来自屏幕空间的颜色缓冲区。
material {
    name : "Glossy metal",
    reflections : screenspace
}
  • shadowMultiplier: 布尔类型,默认为false。仅在未光照的阴影模型中可用。如果启用此属性,则由材质计算的最终颜色乘以阴影因子(或可见性)。这允许创建透明的阴影接收对象(例如AR中不可见的地平面)。这只支持来自定向光的阴影。
material {
    name : "Invisible shadow plane",
    shadingModel : unlit,
    shadowMultiplier : true,
    blending : transparent
}

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        // baseColor defines the color and opacity of the final shadow
        material.baseColor = vec4(0.0, 0.0, 0.0, 0.7);
    }
}
  • transparentShadow: 布尔值类型,默认为false。在此材质上启用透明阴影。当启用此功能时,使用抖动模式模拟透明阴影:它们在方差阴影地图(VSM)和模糊启用时工作得最好。阴影的不透明度直接来源于材质的baseColor属性的alpha通道。透明阴影可以在不透明的物体上启用,使它们与不透明的折射/透射物体兼容。
material {
    name : "Clear plastic with stickers",
    transparentShadow : true,
    blending : transparent,
    // ...
}

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        material.baseColor = texture(materialParams_baseColor, getUV0());
    }
}

  • clearCoatIorChange: 布尔类型,默认是true。在添加透明涂层时,考虑到折射率(IoR)的变化来修改底层的镜面颜色。这似乎使baseColor变暗。当此效果被禁用时,baseColor保持不变。请参见图37,查看此属性如何影响红色金属基础层的示例。
material {
    clearCoatIorChange : false
}

  • multiBounceAmbientOcclusion: 布尔类型,默认值:桌面为true,移动平台为false。当将环境遮挡应用于基于图像的照明时,多反弹环境遮挡考虑了相互反射。开启此功能可避免遮挡区域过度变暗。它还考虑了表面颜色来生成彩色环境遮挡。图38比较了有和没有多弹跳环境遮挡的表面的环境遮挡项。注意多重反射环境遮挡如何在被遮挡的区域引入颜色。图39在点亮的砖块材料上切换多重反射环境遮挡的开启和关闭,以突出此属性的效果。
material {
    multiBounceAmbientOcclusion : true
}

  • specularAmbientOcclusion: string类型,可能的值为none, simple or bentNormals,默认情况,移动平台为none,桌面为simple。静态环境遮挡贴图和动态环境遮挡贴图(SSAO等)适用于漫射间接照明。当将此属性设置为除了none以外的其他值时,一个新的环境遮挡项将从表面粗糙度中衍生出来,并应用于镜面间接照明。这种效果有助于消除不需要的镜面反射,如图40所示。当这个值设置为simple时,引擎使用一种便宜但近似的方法来计算高光环境遮挡项。如果将此值设置为bentNormals, 引擎将使用更精确但更昂贵的方法。
material {
    specularAmbientOcclusion : simple
}

抗锯齿

  • specularAntiAliasing: 布尔类型,默认为false。当一个对象移动远离相机,减少镜面锯齿,并保留镜面高光的形状。这种抗锯齿的解决方案对光滑材料(低粗糙度)特别有效,但增加了材质渲染的成本。抗锯齿效果的强度可以使用另外两个属性来控制:specularAntiAliasingVariance和specularAntiAliasingThreshold。
material {
    specularAntiAliasing : true
}
  • specularAntiAliasingVariance: number类型,值介于0到1之间,默认0.15。设置应用镜面抗锯齿时使用的过滤器内核的屏幕空间方差。较高的值将增加过滤器的效果,但可能增加不需要的区域的粗糙度。
material {
    specularAntiAliasingVariance : 0.2
}
  • specularAntiAliasingThreshold:number类型,值介于0到1之间,默认0.2。设置用于在应用镜面抗混叠时抑制估计误差的夹持阈值。当设置为0时,镜面反锯齿被禁用。
material {
    specularAntiAliasingThreshold : 0.1
}

Shading

  • customSurfaceShading: 布尔值,默认为false。 当设置为true时启用自定义表面着色。当表面着色被启用时,碎片着色器必须提供一个额外的功能,该功能将被场景中可能影响当前碎片的每个光线调用。
material {
    interpolation : flat
}