Partilhar via


Substituir materiais durante a conversão de modelos

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

Quando uma malha triangular é convertida para uso na Renderização Remota do Azure, você pode fornecer um arquivo de substituição de material para personalizar como a conversão de material é feita por material. Se um arquivo chamado <modelName>. MaterialOverrides.json é encontrado no contêiner de entrada com o modelo< de entrada modelName.<>ext>, é usado como o arquivo de substituição de material.

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

Como um exemplo simples, pegue um modelo de caixa que tenha um único material, chamado Default. Sua cor de albedo precisa ser ajustada para uso em renderização remota. Neste caso, uma caixa. O arquivo MaterialOverrides.json pode ser criado da seguinte maneira:

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

A caixa. O arquivo MaterialOverrides.json é colocado no contêiner de entrada com box.fbx, que informa ao serviço de conversão para aplicar as novas configurações.

Materiais de cor

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

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

Ignorar mapas de textura específicos

Às vezes, você pode querer que o processo de conversão ignore mapas de textura específicos. Essa situação pode acontecer quando seu modelo foi gerado por uma ferramenta que gera mapas especiais não compreendidos pelo renderizador. Por exemplo, um "OpacityMap" pode ser usado para definir algo diferente de opacidade, ou o "NormalMap" é armazenado como "BumpMap". Neste último caso, você deseja ignorar "NormalMap", o que faz com que o conversor use "BumpMap" como "NormalMap".

Adicione uma propriedade chamada ignoreTextureMaps e adicione qualquer mapa de textura que você queira ignorar:

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

Para obter a lista completa de mapas de textura que você pode ignorar, consulte o esquema JSON.

Aplicação das mesmas substituições a vários materiais

Por padrão, uma entrada no arquivo de substituições de material se aplica quando seu nome corresponde exatamente ao nome do material. Como é comum que a mesma substituição se aplique a vários materiais, você pode, opcionalmente, fornecer uma expressão regular como o nome da entrada. O campo nameMatching tem um valor exactpadrão, mas pode ser definido para regex indicar que a entrada deve ser aplicada a todos os materiais correspondentes. A sintaxe do regex é a mesma usada para JavaScript.

Gorjeta

Existem sites de teste de regex gratuitos disponíveis para testar e depurar uma expressão regular contra strings 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 que é aplicada a todos os materiais:

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

A ordem em que cada material encontra uma substituição correspondente é a seguinte:

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

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

Obter informações sobre as entradas aplicadas

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

Esquema do JSON

O esquema JSON completo para arquivos de materiais é dado aqui. Exceto para unlit e , as propriedades disponíveis são um subconjunto das propriedades descritas nas seções sobre o material de cor e ignoreTextureMapsos modelos de material 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óximos passos