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:
- MSFT_packing_occlusionRoughnessMetallic
- KHR_materials_unlit: Corresponde a materiais de cor. Para materiais emissivos , recomenda-se o uso desta extensão.
- KHR_materials_pbrSpecularGlossiness: Em vez de texturas metálicas-rugosas, você pode fornecer texturas difusas-especulares-brilhantes. A implementação de Renderização Remota do Azure segue diretamente as fórmulas de conversão da extensão.
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,0721DiffuseBrightness
= 0,299 *Diffuse
. Vermelho2 + 0,587 *Diffuse
. Verde2 + 0,114 *Diffuse
. Azul2SpecularBrightness
= 0,299 *Specular
. Vermelho2 + 0,587 *Specular
. Verde2 + 0,114 *Specular
. Azul2SpecularStrength
= 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
, Specular
e 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
, , TransparencyFactor
Opacity
:
se Opacity
estiver definido, então use-o diretamente: AlbedoAlpha
= Opacity
senão
se TransparencyColor
é definido, então AlbedoAlpha
= 1.0 - ((TransparentColor.Blue
TransparentColor.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 AlbedoAlpha
AlbedoRGB
.
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, é reduzirSpecular
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 deMaya
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.