Compartilhar via


Mapeamento de material para formatos de modelo

Quando um ativo de origem é convertido em modelo, o conversor cria materiais para cada malha. É possível substituir o método de criação dos materiais. No entanto, por padrão, a conversão cria materiais do PBR. Dado que cada formato de arquivo de origem, como FBX, usa convenções próprias para definir materiais, é necessário mapear as convenções aos parâmetros de material do PBR do Azure Remote Rendering.

Este artigo contém os mapeamentos exatos usados para converter materiais de ativos de origem em materiais de runtime.

glTF

O Azure Remote Rendering dá suporte para quase tudo na especificação gITF 2.0, exceto EmissiveFactor e EmissiveTexture.

A tabela abaixo mostra o mapeamento:

glTF Azure Remote Rendering
baseColorFactor albedoColor
baseColorTexture albedoMap
metallicFactor metalness
metallicTexture metalnessMap
roughnessFactor roughness
roughnessTexture roughnessMap
occlusionFactor occlusion
occlusionTexture occlusionMap
normalTexture normalMap
normalTextureInfo.scale normalMapScale
alphaCutoff alphaClipThreshold
alphaMode.OPAQUE alphaClipEnabled = false, isTransparent = false
alphaMode.MASK alphaClipEnabled = true, isTransparent = false
alphaMode.BLEND isTransparent = true
doubleSided isDoubleSided
emissiveFactor -
emissiveTexture -

Cada textura no glTF pode ter um valor texCoord, que também tem suporte nos materiais do Azure Remote Rendering.

Texturas inseridas

Há suporte para texturas inseridas em arquivos *.bin or *.glb.

Extensão do glTF com suporte

Além do conjunto de recursos base, o Azure Remote Rendering dá suporte para as seguintes extensões do glTF:

FBX

O formato FBX tem código fechado, e os materiais do FBX não são compatíveis com os materiais do PBR em geral. O FBX usa uma descrição complexa de superfícies com vários parâmetros e propriedades exclusivos, e nem todos eles são usados no pipeline do Azure Remote Rendering.

Importante

O pipeline de conversão de modelo do Azure Remote Rendering só dá suporte para o FBX 2011 e superior.

O formato FBX define uma abordagem conservadora para materiais. Há apenas dois tipos na especificação oficial do FBX:

  • Lambert – normalmente, não é usado há muito tempo, mas é possível convertê-lo em Phong no momento da conversão para usá-lo.
  • Phong –quase todos os materiais e a maioria das ferramentas de conteúdo usam esse tipo.

Mais preciso, o modelo Phong é usado como o único modelo para materiais do FBX. No restante do artigo, ele será chamado de material do FBX.

O Maya usa duas extensões personalizadas para o FBX e define propriedades personalizadas para o os tipos de material PBR e Stingray. Esses detalhes não fazem parte da especificação do FBX, portanto, o Azure Remote Rendering não dá suporte para eles no momento.

Os materiais do FBX usam o conceito Diffuse-Specular-SpecularLevel, portanto, para converter uma textura difusa em um mapa de albedo, é necessário calcular os outros parâmetros para subtraí-los do difuso.

Todas as cores e texturas do FBX estão no espaço sRGB (também chamado de espaço gama), mas o Azure Remote Rendering trabalha com o espaço linear na visualização e converte tudo de volta para o espaço sRGB ao final do quadro. O pipeline de ativos do Azure Remote Rendering converte tudo para o espaço linear para envio ao renderizador como dados preparados.

Esta tabela mostra o mapeamento das texturas entre materiais do FBX e materiais do Azure Remote Rendering. Alguns deles não são usados diretamente, mas sim em conjunto com outras texturas que participam das fórmulas (por exemplo, a textura diffuse):

FBX Azure Remote Rendering
AmbientColor Occlusion Map
DiffuseColor usado para Albedo, Metalness
TransparentColor usado para o canal alfa de Albedo
TransparencyFactor usado para o canal alfa de Albedo
Opacidade usado para o canal alfa de Albedo
SpecularColor usado para Albedo, Metalness, Roughness
SpecularFactor usado para Albedo, Metalness, Roughness
ShininessExponent usado para Albedo, Metalness, Roughness
NormalMap NormalMap
Bump convertido em NormalMap
EmissiveColor -
EmissiveFactor -
ReflectionColor -
DisplacementColor -

O mapeamento acima é a parte mais complexa da conversão de material, devido às várias suposições feitas. Discutimos as suposições abaixo.

Algumas definições são usadas abaixo:

  • Specular = SpecularColor * SpecularFactor
  • SpecularIntensity = Specular.Red ∗ 0.2125 + Specular.Green ∗ 0.7154 + Specular.Blue ∗ 0.0721
  • DiffuseBrightness = 0.299 * Diffuse.Red2 + 0.587 * Diffuse.Green2 + 0.114 * Diffuse.Blue2
  • SpecularBrightness = 0.299 * Specular.Red2 + 0.587 * Specular.Green2 + 0.114 * Specular.Blue2
  • SpecularStrength = max(Specular.Red, Specular.Green, Specular.Blue)

A fórmula de The SpecularIntensity foi obtida aqui. A fórmula de brilho é descrita nesta especificação.

Irregularidade

Roughness é derivado de Specular e ShininessExponent usando esta fórmula. A fórmula é uma aproximação de aspereza do expoente especular de Phong:

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

Metalicidade

Metalness é derivado de Diffuse e Specular usando essa fórmula da especificação glTF.

A ideia aqui é resolver a equação: Ax2 + Bx + C = 0. Basicamente, as superfícies interelétricas refletem cerca de 4% da luz de uma forma especular, e o restante é difuso. As superfícies metálicas não refletem luz de maneira difusa, mas de maneira especular. Essa fórmula tem algumas desvantagens, porque não há como distinguir entre superfícies brilhantes de plástico ou de metal. Geralmente, supomos que a superfície tem propriedades metálicas e, portanto, as superfícies brilhantes de plástico ou borracha talvez não apareçam 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 é derivado de Diffuse, Specular e Metalness.

Conforme descrito na seção de Metalicidade, as superfícies interelétricas refletem cerca de 4% da luz.
A ideia aqui é interpolar linearmente entre as cores Dielectric e Metal usando o valor Metalness como fator. Se a metalicidade for 0.0, a cor poderá ser escura (se especular for alto) ou a qualidade difusa não será alterada (se não houver especular presente). Se a metalicidade tiver um valor grande, 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 cálculos adicionais. O formato FBX é vago sobre transparência e tem várias maneiras de defini-la. Ferramentas de conteúdo diferentes usam métodos diferentes. A ideia aqui é unificar em uma fórmula. Isso faz com que alguns ativos renderizados incorretamente como transparentes, porém, se eles não forem criados de maneira comum.

Isso é derivado de TransparentColor, TransparencyFactor, Opacity:

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

A cor final Albedo tem quatro canais, combinando AlbedoRGB com AlbedoAlpha.

Resumo

Para resumir aqui, Albedo ficará muito próximo do original Diffuse, se Specular estiver próximo de zero. Caso contrário, a superfície terá aparência metálica e perderá a cor difusa. A superfície terá uma aparência mais polida e reflexiva se ShininessExponent for grande o suficiente e Specular for brilhante. Caso contrário, a superfície terá uma aparência áspera e quase não refletirá o ambiente.

Problemas conhecidos

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

Próximas etapas