Mapping del materiale per i formati di modello
Quando un asset di origine viene convertito come modello, il convertitore crea materiali per ogni mesh. Il modo in cui vengono creati i materiali può essere sottoposto a override. Tuttavia, per impostazione predefinita, la conversione creerà materiali PBR. Poiché ogni formato di file di origine, come FBX, usa le proprie convenzioni per definire i materiali, tali convenzioni devono essere mappate ai parametri del materiale PBR di Azure Rendering remoto.
Questo articolo elenca i mapping esatti usati per convertire i materiali dagli asset di origine ai materiali di runtime.
glTF
Quasi tutti gli elementi della specifica glTF 2.0 sono supportati in Azure Rendering remoto, ad eccezione di EmissiveFactor e EmissiveTexture.
La tabella seguente illustra il mapping:
glTF | Rendering remoto di Azure |
---|---|
baseColorFactor | albedoColor |
baseColorTexture | albedoMap |
metallicFactor | metalness |
metallicTexture | metalnessMap |
roughnessFactor | Rugosità |
rugositàTexture | roughnessMap |
occlusionFactor | Occlusione |
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 | - |
Ogni trama in glTF può avere un texCoord
valore, supportato anche nei materiali Rendering remoto di Azure.
Trame incorporate
Le trame incorporate nei file *.bin o *.glb sono supportate.
Estensione glTF supportata
Inoltre, al set di funzionalità di base, Azure Rendering remoto supporta le estensioni glTF seguenti:
- MSFT_packing_occlusionRoughnessMetallic
- KHR_materials_unlit: corrisponde ai materiali a colori. Per i materiali emissivi , è consigliabile usare questa estensione.
- KHR_materials_pbrSpecularGlossiness: invece di trame metalliche, è possibile fornire trame di glossario speculare diffuse. L'implementazione di Azure Rendering remoto segue direttamente le formule di conversione dall'estensione.
FBX
Il formato FBX è closed source e i materiali FBX non sono compatibili con i materiali PBR in generale. FBX usa una descrizione complessa delle superfici con molti parametri e proprietà univoci e non tutti vengono usati dalla pipeline di Azure Rendering remoto.
Importante
La pipeline di conversione del modello Rendering remoto di Azure supporta solo FBX 2011 e versioni successive.
Il formato FBX definisce un approccio conservativo per i materiali, esistono solo due tipi nella specifica FBX ufficiale:
- Lambert - Non comunemente usato per un bel po 'di tempo, ma è ancora supportato convertendo in Phong in fase di conversione.
- Phong : quasi tutti i materiali e la maggior parte degli strumenti di contenuto usano questo tipo.
Il modello Phong è più accurato ed è usato come unico modello per i materiali FBX. Di seguito verrà indicato come materiale FBX.
Maya usa due estensioni personalizzate per FBX definendo proprietà personalizzate per i tipi PBR e Stingray di un materiale. Questi dettagli non sono inclusi nella specifica FBX, quindi non è attualmente supportato da Azure Rendering remoto.
I materiali FBX usano il concetto Diffuse-Specular-SpecularLevel, quindi per convertire da una trama diffusa a una mappa albedo è necessario calcolare gli altri parametri per sottrarli dalla diffusione.
Tutti i colori e le trame in FBX si trovano nello spazio sRGB (noto anche come spazio Gamma), ma Azure Rendering remoto funziona con lo spazio lineare durante la visualizzazione e alla fine del frame converte tutto nello spazio sRGB. La pipeline di asset Rendering remoto di Azure converte tutto in spazio lineare per inviarli come dati preparati al renderer.
Questa tabella illustra il mapping delle trame dai materiali FBX ai materiali Rendering remoto di Azure. Alcuni di essi non vengono usati direttamente, ma in combinazione con altre trame che partecipano alle formule (ad esempio la trama diffusa):
FBX | Rendering remoto di Azure |
---|---|
AmbientColor | Mappa occlusione |
DiffuseColor | utilizzato per Albedo, Metalness |
TransparentColor | utilizzato per il canale alfa di Albedo |
TransparencyFactor | utilizzato per il canale alfa di Albedo |
Opacità | utilizzato per il canale alfa di Albedo |
SpecularColor | utilizzato per Albedo, Metalness, Roughness |
SpecularFactor | utilizzato per Albedo, Metalness, Roughness |
ShininessExponent | utilizzato per Albedo, Metalness, Roughness |
NormalMap | NormalMap |
Urto | convertito in NormalMap |
EmissiveColor | - |
EmissiveFactor | - |
ReflectionColor | - |
SpostamentoColor | - |
Il mapping precedente è la parte più complessa della conversione del materiale, a causa di molti presupposti che devono essere fatti. Di seguito vengono illustrati questi presupposti.
Alcune definizioni usate di seguito:
Specular
=SpecularColor
*SpecularFactor
SpecularIntensity
=Specular
. Rosso ∗ 0.2125 +Specular
. Verde ∗ 0,7154 +Specular
. Blu ∗ 0.0721DiffuseBrightness
= 0,299 *Diffuse
. Rosso2 + 0,587 *Diffuse
. Verde2 + 0,114 *Diffuse
. Blu2SpecularBrightness
= 0,299 *Specular
. Rosso2 + 0,587 *Specular
. Verde2 + 0,114 *Specular
. Blu2SpecularStrength
= max(Specular
. Rosso,Specular
. Verde,Specular
. Blu)
La formula SpecularIntensity viene ottenuta da qui. La formula di luminosità è descritta in questa specifica.
Ruvidità
Roughness
viene calcolato da Specular
e ShininessExponent
utilizzando questa formula. La formula è un'approssimazione della rugosità dell'esponente speculare Phong:
Roughness = sqrt(2 / (ShininessExponent * SpecularIntensity + 2))
Metalness
Metalness
viene calcolato da Diffuse
e Specular
utilizzando questa formula dalla specifica glTF.
L'idea è che risolviamo l'equazione: Ax2 + Bx + C = 0. Fondamentalmente, le superfici disattive riflettono circa il 4% della luce in modo speculare, e il resto è diffuso. Le superfici metalliche non riflettono alcuna luce in modo diffuso, ma tutto in modo speculare. Questa formula presenta alcuni svantaggi, perché non c'è modo di distinguere tra la plastica lucida e le superfici metalliche lucide. Si presuppone che la maggior parte del tempo la superficie abbia proprietà metalliche, e quindi superfici di plastica/gomma lucide potrebbero non sembrare come previsto.
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
viene calcolato da Diffuse
, Specular
e Metalness
.
Come descritto nella sezione Metalness, le superfici disogne riflettono circa il 4% della luce.
L'idea qui consiste nell'interpolare in modo lineare tra Dielectric
i colori e Metal
usando Metalness
il valore come fattore. Se il metallo è 0.0
, a seconda dello speculare sarà un colore scuro (se speculare è elevato) o la diffusione non cambierà (se non è presente alcuna speculare). Se il metallo è un valore elevato, il colore diffuso scomparirà a favore del colore speculare.
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
è stato calcolato dalla formula precedente, ma il canale alfa richiede più calcoli. Il formato FBX è vago sulla trasparenza e ha molti modi per definirlo. Diversi strumenti di contenuto usano metodi diversi. L'idea è di unificarle in una sola formula. Il rendering di alcuni asset viene eseguito in modo non corretto come trasparente, tuttavia, se non vengono creati in modo comune.
Viene calcolato da TransparentColor
, TransparencyFactor
, Opacity
:
se Opacity
è definito, usarlo direttamente: AlbedoAlpha
= Opacity
se TransparencyColor
è definito, quindi AlbedoAlpha
= 1.0 - ((TransparentColor.Blue
TransparentColor.Red
+ TransparentColor.Green
+ ) / 3.0) else
se TransparencyFactor
, then AlbedoAlpha
= 1.0 - TransparencyFactor
Il colore finale Albedo
ha quattro canali, combinando con AlbedoRGB
.AlbedoAlpha
Riepilogo
Per riepilogare qui, Albedo
sarà molto vicino all'originale Diffuse
, se Specular
è vicino a zero. In caso contrario, la superficie sarà simile a una superficie metallica e perde il colore diffuso. La superficie sarà più lucidata e riflettente se ShininessExponent
è abbastanza grande ed Specular
è brillante. In caso contrario, la superficie avrà un aspetto approssimativo e rifletterà a malapena l'ambiente.
Problemi noti
- La formula corrente non funziona correttamente per la geometria colorata semplice. Se
Specular
è abbastanza luminoso, tutte le geometrie diventano superfici metalliche riflettenti senza alcun colore. La soluzione alternativa in questo caso consiste nell'abbassareSpecular
al 30% rispetto all'originale o usare l'impostazione di conversione fbxAssumePartizioniic. - I materiali PBR sono stati recentemente aggiunti agli strumenti di
Maya
creazione del contenuto e3DS Max
. Usano proprietà black box personalizzate definite dall'utente per passarlo a FBX. Azure Rendering remoto non legge tali proprietà perché non sono documentate e il formato è closed source.