你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在模型转换期间替代材料

源模型中的材料设置用于定义渲染器所使用的 PBR 材料。 有时默认转换提供不了所需的结果,需要进行更改。 有关详细信息,请参阅模型格式的材料映射

为便于在 Azure 远程渲染中使用而对三角网格进行转换时,可以提供材料替代文件,从而自定义每种材料的材料转换方式。 如果在输入模型为 <modelName>.<ext> 的输入容器中找到了名为 <modelName>.MaterialOverrides.json 的文件,则该文件将用作材料替代文件

转换期间使用的替代文件

举个简单的例子,假设方框模型只含一个称为 Default 的材料。 需要调整其 albedo 颜色,以便在远程渲染中使用。 在这种情况下,可以创建一个 box.MaterialOverrides.json 文件,如下所示

[
    {
        "name": "Default",
        "albedoColor": {
            "r": 0.33,
            "g": 0.33,
            "b": 0.33,
            "a": 1.0
        }
    }
]

将 box.MaterialOverrides.json 文件放在具有 box.fbx 的输入容器中,指示转换服务应用新的设置

颜色材料

颜色材料模型介绍了无照明情况下持续着色的表面。 例如,颜色材料适用于摄影测量算法创建的资产。 有关详细信息,请参阅配色材料。 在材料替代文件中,通过将 unlit 设置为 true,可以将材料声明为颜色材料。

[
    {
        "name": "Photogrametry_mat1",
        "unlit" : true
    },
    {
        "name": "Photogrametry_mat2",
        "unlit" : true
    }
]

忽略特定纹理映射

有时可能需要转换过程忽略特定纹理映射。 当借助某种工具生成模型,且该工具生成渲染器无法正确理解的特定映射时,这种情况就可能发生。 例如,OpacityMap 可能用于定义不透明度以外的内容,或 NormalMap 存储为 BumpMap。 (对于后一种情况,需要忽略 NormalMap,因为它会导致转换器将 BumpMap 用作 NormalMap。)

添加一个名为 ignoreTextureMaps 的属性,并添加要忽略的纹理映射:

[
    {
        "name": "Default",
        "ignoreTextureMaps": ["OpacityMap", "NormalMap"]
    }
]

有关可忽略的纹理映射的完整列表,请参阅 JSON 架构

将相同替代应用于多种材料

默认情况下,当材料替代文件中的条目名与材料名完全匹配时,将应用该条目。 由于经常需要将相同替代应用于多种材料,因此,可以根据需要提供一个正则表达式作为条目名。 字段 nameMatching 具有默认值 exact,但可以设置为 regex,以表明该条目会应用于每种匹配的材料。 正则表达式的语法与用于 JavaScript 的语法相同。

提示

可以使用免费的正则表达式测试网站针对任意字符串测试和调试正则表达式。

下面的示例演示了应用于材料名如 Material2Material01Material999 的一个替代。

[
    {
        "name": "Material[0-9]+",
        "nameMatching": "regex",
        "albedoColor": {
            "r": 0.0,
            "g": 0.0,
            "b": 1.0,
            "a": 1.0
        }
    }
]

此示例演示一个应用于所有材料的替代:

[
    {
        "name": ".*",
        "nameMatching": "regex",
        "albedoColor": {
            "r": 0.0,
            "g": 0.0,
            "b": 1.0,
            "a": 1.0
        }
    }
]

每个材料查找匹配替代的顺序如下:

  1. 首先,它测试名称是否完全匹配(即检查其中的 nameMatching 不存在或等于 exact 的所有替代)。
  2. 如果未找到替代,它会测试所有具有 regex 名称匹配模式的替代,并使用匹配的第一个替代。

即使将多个 regex 表达式应用于材料名称,单个材料也永远不会应用多个替代。

获取有关应用条目的信息

写入到输出容器的信息文件提供了有关所提供的替代数以及已替代的材料数的信息。 有关详细信息,请参阅有关转换后的模型的信息

JSON 架构

此处提供了材料文件的完整 JSON 架构。 除了 unlitignoreTextureMaps 之外,可用属性均为配色材料PBR 材料模型部分中描述的属性的子集。

{
    "definitions" :
    {
        "color":
        {
            "type" : "object",
            "description" : "Color as 4 components vector",
            "properties":
            {
                "r": {"type":"number"},
                "g": {"type":"number"},
                "b": {"type":"number"},
                "a": {"type":"number"}
            },
            "required": ["r", "g", "b"]
        },
        "alpha":
        {
            "type" : "object",
            "description" : "Alpha channel for color",
            "properties":
            {
                "a": {"type":"number"}
            },
            "required": ["a"]
        },
        "colorOrAlpha":
        {
            "anyOf": [
                {"$ref": "#/definitions/color"},
                {"$ref": "#/definitions/alpha"}
            ]
        },
        "listOfMaps":
        {
            "type": "array",
            "items": {
                "type": "string",
                "enum": ["AlbedoMap",
                            "EmissiveMap",
                            "NormalMap",
                            "OcclusionMap",
                            "RoughnessMap",
                            "MetalnessMap",
                            "ReflectivityMap",
                            "BumpMap",
                            "OpacityMap",
                            "DiffuseMap",
                            "SpecularMap",
                            "ShininessMap",
                            "MetallicRoughnessMap",
                            "SpecularGlossinessMap"]
            }
        }
    },
    "type" : "array",
    "description" : "List of materials to override",
    "items":
    {
        "type" : "object",
        "description" : "List of parameters to override",
        "properties":
        {
            "name": { "type" : "string"},
            "nameMatching" : { "type" : "string", "enum" : ["exact", "regex"] },
            "unlit": { "type" : "boolean" },
            "albedoColor": { "$ref": "#/definitions/colorOrAlpha" },
            "roughness": { "type": "number" },
            "metalness": { "type": "number" },
            "normalMapScale": { "type": "number" },
            "transparent": { "type" : "boolean" },
            "alphaClipEnabled": { "type" : "boolean" },
            "alphaClipThreshold": { "type": "number" },
            "useVertexColor": { "type" : "boolean" },
            "isDoubleSided": { "type" : "boolean" },
            "ignoreTextureMaps": { "$ref" : "#/definitions/listOfMaps" },
            "transparencyWritesDepth": {"type" : "boolean" }
        },
        "required": ["name"],
        "additionalProperties" : false
    }
}

后续步骤