Partilhar via


Mapeamento de materiais para formatos de modelos

Quando um ativo de origem é convertido como modelo, o conversor cria materiais para cada malha. A forma como os materiais são criados pode ser substituída. No entanto, por padrão, a conversão criará materiais PBR. Como cada formato de arquivo de origem, como FBX, usa suas próprias convenções para definir materiais, essas convenções devem ser mapeadas para os parâmetros de material PBR da Renderização Remota do Azure.

Este artigo lista os mapeamentos exatos usados para converter materiais de ativos de origem em materiais de tempo de execução.

glTF

Quase tudo da especificação glTF 2.0 é suportado na Renderização Remota do Azure, exceto EmissiveFactor e EmissiveTexture.

A tabela a seguir mostra o mapeamento:

glTF Azure Remote Rendering
baseColorFactor albedoColor
baseColorTexture albedoMapa
metallicFactor metalomecânica
metallicTexture metalismoMapa
rugosidadeFactor rugosidade
rugosidadeTextura rugosidadeMapa
occlusãoFactor oclusão
oclusãoTextura occlusãoMapa
normalTexture normalMapa
normalTextureInfo.scale normalMapScale
alfaCutoff alfaClipThreshold
alphaMode.OPAQUE alphaClipEnabled = false, isTransparent = false
alfaMode.MASK alphaClipEnabled = true, isTransparent = false
alphaMode.BLEND isTransparent = verdadeiro
frente e verso isDoubleSided
emissiveFactor -
emissiveTexture -

Cada textura no glTF pode ter um texCoord valor, que também é suportado nos materiais de Renderização Remota do Azure.

Texturas incorporadas

Texturas incorporadas em arquivos *.bin ou *.glb são suportadas.

Extensão glTF suportada

Além do conjunto de recursos básico, a Renderização Remota do Azure dá suporte às seguintes extensões glTF:

FBX

O formato FBX é de código fechado e os materiais FBX não são compatíveis com materiais PBR em geral. O FBX usa uma descrição complexa de superfícies com muitos parâmetros e propriedades exclusivos e nem todos eles são usados pelo pipeline de Renderização Remota do Azure.

Importante

O pipeline de conversão de modelo de Renderização Remota do Azure suporta apenas FBX 2011 e superior.

O formato FBX define uma abordagem conservadora para materiais, existem apenas dois tipos na especificação oficial FBX:

  • Lambert - Não é comumente usado por algum tempo já, mas ainda é suportado pela conversão para Phong no momento da conversão.
  • Phong - Quase todos os materiais e a maioria das ferramentas de conteúdo usam este tipo.

O modelo Phong é mais preciso e é usado como o único modelo para materiais FBX. Abaixo será referido como o Material FBX.

O Maya usa duas extensões personalizadas para FBX definindo propriedades personalizadas para os tipos PBR e Stingray de um material. Esses detalhes não estão incluídos na especificação FBX, portanto, não há suporte para a Renderização Remota do Azure atualmente.

FBX Materials usa o conceito Diffuse-Specular-SpecularLevel, então para converter de uma textura difusa para um mapa de albedo precisamos calcular os outros parâmetros para subtraí-los do difuso.

Todas as cores e texturas no FBX estão no espaço sRGB (também conhecido como espaço Gama), mas a Renderização Remota do Azure funciona com espaço linear durante a visualização e, no final do quadro, converte tudo de volta para o espaço sRGB. O pipeline de ativos de Renderização Remota do Azure converte tudo em espaço linear para enviá-lo como dados preparados para o renderizador.

Esta tabela mostra como as texturas são mapeadas de Materiais FBX para materiais de Renderização Remota do Azure. Alguns deles não são usados diretamente, mas em combinação com outras texturas que participam das fórmulas (por exemplo, a textura difusa):

FBX Azure Remote Rendering
Cor Ambiente Mapa de Oclusão
DiffuseColor usado para Albedo, Metalness
TransparentColor usado para o canal alfa de Albedo
Fator de Transparência usado para o canal alfa de Albedo
Opacidade usado para o canal alfa de Albedo
SpecularColor usado para Albedo, Metalidade, Rugosidade
Fator Especular usado para Albedo, Metalidade, Rugosidade
ShininessExponent usado para Albedo, Metalidade, Rugosidade
Mapa Normal Mapa Normal
Colisão convertido para NormalMap
EmissiveColor -
EmissiveFactor -
ReflectionColor -
DisplacementColor -

O mapeamento acima é a parte mais complexa da conversão material, devido a muitas suposições que precisam ser feitas. Discutimos esses pressupostos abaixo.

Algumas definições usadas abaixo:

  • Specular = SpecularColor * SpecularFactor
  • SpecularIntensity = Specular. Vermelho ∗ 0,2125 + Specular. Verde ∗ 0,7154 + Specular. Azul ∗ 0,0721
  • DiffuseBrightness = 0,299 * Diffuse. Vermelho2 + 0,587 * Diffuse. Verde2 + 0,114 * Diffuse. Azul2
  • SpecularBrightness = 0,299 * Specular. Vermelho2 + 0,587 * Specular. Verde2 + 0,114 * Specular. Azul2
  • SpecularStrength = máx(Specular. Vermelho, Specular. Verde, Specular. Azul)

A fórmula SpecularIntensity é obtida a partir daqui. A fórmula de brilho é descrita nesta especificação.

Rugosidade

Roughness é calculado a partir e Specular ShininessExponent utilizando esta fórmula. A fórmula é uma aproximação da rugosidade do expoente especular Phong:

Roughness = sqrt(2 / (ShininessExponent * SpecularIntensity + 2))

Metalomecânica

Metalnessé calculado a partir e usando esta fórmula a partir Diffuse Specular da especificação glTF.

A ideia aqui é, que nós resolvemos a equação: Ax2 + Bx + C = 0. Basicamente, as superfícies dielétricas refletem cerca de 4% da luz de forma especular, e o resto é difuso. As superfícies metálicas não refletem luz de forma difusa, mas tudo de forma especular. Esta fórmula tem algumas desvantagens, porque não há como distinguir entre plástico brilhante e superfícies metálicas brilhantes. Assumimos que, na maioria das vezes, a superfície tem propriedades metálicas e, portanto, as superfícies de plástico/borracha brilhantes podem não parecer como esperado.

dielectricSpecularReflectance = 0.04
oneMinusSpecularStrength = 1 - SpecularStrength

A = dielectricSpecularReflectance
B = (DiffuseBrightness * (oneMinusSpecularStrength / (1 - A)) + SpecularBrightness) - 2 * A
C = A - SpecularBrightness
squareRoot = sqrt(max(0.0, B * B - 4 * A * C))
value = (-B + squareRoot) / (2 * A)
Metalness = clamp(value, 0.0, 1.0);

Albedo

Albedo é calculado a partir de Diffuse, Speculare Metalness.

Conforme descrito na seção Metalness, as superfícies dielétricas refletem cerca de 4% da luz.
A ideia aqui é interpolar linearmente entre Dielectric e Metal cores usando Metalness o valor como um fator. Se a metalidade é 0.0, então, dependendo do especular, será uma cor escura (se o especular for alto) ou difusa não mudará (se nenhum especular estiver presente). Se a metalidade é um grande valor, então a cor difusa desaparecerá em favor da cor especular.

dielectricSpecularReflectance = 0.04
oneMinusSpecularStrength = 1 - SpecularStrength

dielectricColor = diffuseColor * (oneMinusSpecularStrength / (1.0f - dielectricSpecularReflectance) / max(1e-4, 1.0 - metalness))
metalColor = (Specular - dielectricSpecularReflectance * (1.0 - metalness)) * (1.0 / max(1e-4, metalness))
albedoRawColor = lerpColors(dielectricColor, metalColor, metalness * metalness)
AlbedoRGB = clamp(albedoRawColor, 0.0, 1.0);

AlbedoRGB foi calculado pela fórmula acima, mas o canal alfa requer mais cálculos. O formato FBX é vago sobre transparência e tem muitas maneiras de defini-lo. Diferentes ferramentas de conteúdo usam métodos diferentes. A ideia aqui é unificá-los em uma fórmula. No entanto, isso torna alguns ativos incorretamente renderizados como transparentes, se eles não forem criados de uma maneira comum.

Este valor é calculado a partir de TransparentColor, , TransparencyFactorOpacity:

se Opacity estiver definido, então use-o diretamente: AlbedoAlpha = Opacity senão
se TransparencyColor é definido, então AlbedoAlpha = 1.0 - ((TransparentColor.BlueTransparentColor.Red + TransparentColor.Green + ) / 3.0) else
se TransparencyFactor, então AlbedoAlpha = 1,0 - TransparencyFactor

A cor final Albedo tem quatro canais, combinando o com o AlbedoAlphaAlbedoRGB .

Resumo

Para resumir aqui, será muito próximo do originalDiffuse, Albedo se Specular estiver próximo de zero. Caso contrário, a superfície parecerá uma superfície metálica e perderá a cor difusa. A superfície parecerá mais polida e reflexiva se ShininessExponent for grande o suficiente e Specular for brilhante. Caso contrário, a superfície parecerá áspera e mal refletirá o ambiente.

Problemas conhecidos

  • A fórmula atual não funciona bem para geometria colorida simples. Se Specular for suficientemente brilhante, então todas as geometrias tornam-se superfícies metálicas reflexivas sem qualquer cor. A solução alternativa, neste caso, é reduzir Specular para 30% do original ou usar a configuração de conversão fbxAssumeMetallic.
  • Recentemente foram adicionados materiais PBR e 3DS Max ferramentas de criação de Maya conteúdo. Eles usam propriedades de caixa preta personalizadas definidas pelo usuário para passá-lo para o FBX. A Renderização Remota do Azure não lê essas propriedades porque elas não estão documentadas e o formato é de código fechado.

Próximos passos