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:
- MSFT_packing_occlusionRoughnessMetallic
- KHR_materials_unlit: corresponde a materiais de cor. Para materiais emissive, recomendamos usar essa extensão.
- KHR_materials_pbrSpecularGlossiness: em vez de texturas metallic-roughness, você pode usar texturas diffuse-specular-glossiness. A implementação do Azure Remote Rendering segue diretamente as fórmulas de conversão da extensão.
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.0721DiffuseBrightness
= 0.299 *Diffuse
.Red2 + 0.587 *Diffuse
.Green2 + 0.114 *Diffuse
.Blue2SpecularBrightness
= 0.299 *Specular
.Red2 + 0.587 *Specular
.Green2 + 0.114 *Specular
.Blue2SpecularStrength
= 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 é reduzirSpecular
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
e3DS 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.