Compartilhar via


Substituir materiais durante a conversão de modelo

As configurações de material no modelo de origem definem os materiais de PBR usados pelo renderizador. Às vezes, a conversão padrão não fornece os resultados desejados, e você precisa fazer alterações. Para obter mais informações, confira Mapeamento de materiais para formatos de modelo.

Quando uma malha triangular é convertida para ser usada no Azure Remote Rendering, você pode fornecer um arquivo de substituição de material para personalizar como a conversão de material é feita de acordo com cada material. Se um arquivo chamado <modelName>.MaterialOverrides.json for encontrado no contêiner de entrada com o modelo de entrada <modelName>.<ext>, ele será usado como o arquivo de substituição de material.

O arquivo de substituição usado durante a conversão

Como um exemplo simples, digamos que um modelo de caixa tenha um só material, chamado Default. Sua cor albedo precisa ser ajustada para uso no Remote Rendering. Nesse caso, um arquivo box.MaterialOverrides.json pode ser criado da seguinte maneira:

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

O arquivo box.MaterialOverrides.json é colocado no contêiner de entrada ao lado de box.fbx, que instrui o serviço de conversão a aplicar as novas configurações.

Materiais de cores

O modelo de material de cor descreve uma superfície constantemente sombreada que é independente da iluminação. Os materiais de cores são úteis para ativos feitos por algoritmos de fotogrametria, por exemplo. Para obter mais informações, confira Materiais de cores. Em arquivos de substituição de material, um material pode ser declarado como um material de cor pela definição de unlit como true.

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

Ignorar mapas de textura específicos

Às vezes, o ideal é que o processo de conversão ignore mapas de textura específicos. Essa situação pode ocorrer quando o modelo for gerado por uma ferramenta que gera mapas especiais não compreendidos pelo renderizador. Por exemplo, um "OpacityMap" pode ser usado para definir algo diferente da opacidade, ou o "NormalMap" é armazenado como "BumpMap". No último caso, o ideal é ignorar "NormalMap", o que fará com que o conversor use "BumpMap" como "NormalMap".

Adicione uma propriedade chamada ignoreTextureMaps e adicionar qualquer mapa de textura que você deseja ignorar:

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

Para obter a lista completa de mapas de textura que podem ser ignorados, confira o esquema JSON.

Como aplicar as mesmas substituições a vários materiais

Por padrão, uma entrada no arquivo de substituições de material se aplica quando o nome dela corresponde exatamente ao nome do material. Como é comum que a mesma substituição precise ser aplicada a vários materiais, opcionalmente, forneça uma expressão regular como o nome da entrada. O campo nameMatching tem um valor padrão igual a exact, mas pode ser definido como regex para declarar que a entrada deve ser aplicada a cada material correspondente. A sintaxe do regex é a mesma usada para JavaScript.

Dica

Há sites de teste de regex gratuitos disponíveis para testar e depurar uma expressão regular em relação a cadeias de caracteres arbitrárias.

O exemplo a seguir mostra uma substituição que se aplica a materiais com nomes como Material2, Material01 e Material999.

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

Este exemplo mostra uma substituição aplicada a todos os materiais:

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

A ordem na qual cada material encontra uma substituição correspondente é a seguinte:

  1. Primeiro, ele testa a correspondência exata de nome (ou seja, verifica todas as substituições em que nameMatching está ausente ou é igual a exact).
  2. Se nenhuma substituição for encontrada, ela testa todas as substituições com o modo de correspondência de nomes regex e usa a primeira substituição correspondente.

Um só material nunca recebe mais de uma substituição, mesmo que várias expressões regex se apliquem ao nome do material.

Como obter informações sobre quais entradas são aplicadas

O arquivo de informações gravado no contêiner de saída contém informações sobre o número de substituições fornecidas e o número de materiais substituídos. Para obter mais informações, confira Informações sobre um modelo convertido.

Esquema do JSON

O esquema JSON completo para arquivos de materiais é fornecido aqui. Com exceção de unlit e ignoreTextureMaps, as propriedades disponíveis são um subconjunto das propriedades descritas nas seções sobre o material de cor e os modelos do material de 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
    }
}

Próximas etapas