Materialmappning för modellformat
När en källtillgång konverteras som en modell skapar konverteraren material för varje nät. Hur material skapas kan åsidosättas. Konverteringen skapar dock PBR-material som standard. Eftersom varje källfilformat, till exempel FBX, använder sina egna konventioner för att definiera material, måste dessa konventioner mappas till PBR-materialparametrarna för Azure Remote Rendering.
Den här artikeln visar de exakta mappningar som används för att konvertera material från källtillgångar till körningsmaterial.
glTF
Nästan allt från glTF 2.0-specifikationen stöds i Azure Remote Rendering, förutom EmissiveFactor och EmissiveTexture.
Följande tabell visar mappningen:
glTF | Azure Remote Rendering |
---|---|
baseColorFactor | albedoColor |
baseColorTexture | albedoMap |
metallicFactor | metallighet |
metallicTexture | metalnessMap |
roughnessFactor | Strävhet |
roughnessTexture | roughnessMap |
occlusionFactor | Ocklusion |
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 | - |
Varje struktur i glTF kan ha ett texCoord
värde som också stöds i Azure Remote Rendering-material.
Inbäddade texturer
Texturer som är inbäddade i *.bin - eller *.glb-filer stöds.
GlTF-tillägg som stöds
Utöver basfunktionsuppsättningen stöder Azure Remote Rendering följande glTF-tillägg:
- MSFT_packing_occlusionRoughnessMetallic
- KHR_materials_unlit: Motsvarar färgmaterial. För tillåtande material rekommenderar vi att du använder det här tillägget.
- KHR_materials_pbrSpecularGlossiness: I stället för texturer av metallisk grovhet kan du tillhandahålla diffusa-specular-glossiness texturer. Azure Remote Rendering-implementeringen följer direkt konverteringsformler från tillägget.
FBX
FBX-formatet är sluten källkod och FBX-material är inte kompatibla med PBR-material i allmänhet. FBX använder en komplex beskrivning av ytor med många unika parametrar och egenskaper och alla används inte av Azure Remote Rendering-pipelinen.
Viktigt!
Konverteringspipelinen för Azure Remote Rendering-modellen stöder endast FBX 2011 och senare.
FBX-formatet definierar en konservativ metod för material, det finns bara två typer i den officiella FBX-specifikationen:
- Lambert - Används inte ofta under en längre tid redan, men det stöds fortfarande genom att konvertera till Phong vid konverteringstidpunkt.
- Phong – Nästan alla material och de flesta innehållsverktyg använder den här typen.
Phong-modellen är mer exakt och används som den enda modellen för FBX-material. Nedan kallas det FBX-materialet.
Maya använder två anpassade tillägg för FBX genom att definiera anpassade egenskaper för PBR- och Stingray-typer av ett material. Den här informationen ingår inte i FBX-specifikationen, så den stöds inte av Azure Remote Rendering för närvarande.
FBX-material använder konceptet Diffuse-Specular-SpecularLevel, så för att konvertera från en diffus struktur till en albedokarta måste vi beräkna de andra parametrarna för att subtrahera dem från diffusa.
Alla färger och texturer i FBX finns i sRGB-utrymme (även kallat Gamma-utrymme) men Azure Remote Rendering fungerar med linjärt utrymme under visualiseringen och i slutet av ramen konverteras allt tillbaka till sRGB-utrymme. Azure Remote Rendering-tillgångspipelinen konverterar allt till linjärt utrymme för att skicka den som förberedda data till renderaren.
Den här tabellen visar hur texturer mappas från FBX-material till Azure Remote Rendering-material. Vissa av dem används inte direkt utan i kombination med andra texturer som deltar i formler (till exempel den diffusa strukturen):
FBX | Azure Remote Rendering |
---|---|
AmbientColor | Ocklusionskarta |
DiffuseColor | används för Albedo, Metalness |
TransparentColor | används för alfakanal i Albedo |
TransparencyFactor | används för alfakanal i Albedo |
Opacitet | används för alfakanal i Albedo |
SpecularColor | används för Albedo, metalness, roughness |
SpecularFactor | används för Albedo, metalness, roughness |
ShininessExponent | används för Albedo, metalness, roughness |
Normalmap | Normalmap |
Stöta | konverteras till NormalMap |
EmissiveColor | - |
EmissiveFactor | - |
ReflectionColor | - |
DisplacementColor | - |
Mappningen ovan är den mest komplexa delen av materialkonverteringen på grund av många antaganden som måste göras. Vi diskuterar dessa antaganden nedan.
Några definitioner som används nedan:
Specular
=SpecularColor
*SpecularFactor
SpecularIntensity
=Specular
. Röd ∗ 0,2125 +Specular
. Grön ∗ 0,7154 +Specular
. Blå ∗ 0,0721DiffuseBrightness
= 0,299 *Diffuse
. Röd2 + 0,587 *Diffuse
. Grön2 + 0,114 *Diffuse
. Blå2SpecularBrightness
= 0,299 *Specular
. Röd2 + 0,587 *Specular
. Grön2 + 0,114 *Specular
. Blå2SpecularStrength
= max(Specular
. Röd,Specular
. Grön,Specular
. Blå)
Formeln SpecularIntensity hämtas härifrån. Formeln för ljusstyrka beskrivs i den här specifikationen.
Strävhet
Roughness
beräknas från Specular
och ShininessExponent
med den här formeln. Formeln är en uppskattning av grovhet från Phong specular exponent:
Roughness = sqrt(2 / (ShininessExponent * SpecularIntensity + 2))
Metallighet
Metalness
beräknas från Diffuse
och Specular
med den här formeln från glTF-specifikationen.
Tanken här är att vi löser ekvationen: Ax2 + Bx + C = 0. I grund och botten reflekterar dielektriska ytor cirka 4% av ljuset på ett spekulativt sätt, och resten är diffust. Metalliska ytor reflekterar inget ljus på ett diffust sätt, men allt på ett spekulativt sätt. Den här formeln har några nackdelar, eftersom det inte finns något sätt att skilja mellan glansiga plast- och glansiga metalliska ytor. Vi antar att större delen av tiden ytan har metalliska egenskaper, och så glänsande plast / gummi ytor kanske inte ser ut som förväntat.
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
beräknas från Diffuse
, Specular
och Metalness
.
Som beskrivs i avsnittet Metallitet reflekterar dielektriska ytor cirka 4% av ljuset.
Tanken här är att linjärt interpolera mellan Dielectric
och Metal
färger med värdet Metalness
som en faktor. Om metallighet är 0.0
, kommer det beroende på spektulärt att vara antingen en mörk färg (om spektulärt är högt) eller diffus ändras inte (om det inte finns någon spektulär). Om metallitet är ett stort värde försvinner den diffusa färgen till förmån för spekulativ färg.
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
har beräknats med formeln ovan, men alfakanalen kräver fler beräkningar. FBX-formatet är vagt om transparens och har många sätt att definiera det. Olika innehållsverktyg använder olika metoder. Tanken här är att förena dem i en formel. Det gör dock vissa tillgångar felaktigt renderade som transparenta om de inte skapas på ett vanligt sätt.
Detta beräknas från TransparentColor
, TransparencyFactor
, Opacity
:
om Opacity
har definierats använder du det direkt: AlbedoAlpha
= Opacity
annars
if TransparencyColor
is defined, then AlbedoAlpha
= 1.0 - ((TransparentColor.Blue
TransparentColor.Red
+ TransparentColor.Green
+ ) / 3.0) else
if TransparencyFactor
, then AlbedoAlpha
= 1.0 - TransparencyFactor
Den sista Albedo
färgen har fyra kanaler som kombinerar AlbedoRGB
med AlbedoAlpha
.
Sammanfattning
För att sammanfatta här, Albedo
kommer att vara mycket nära den ursprungliga Diffuse
, om Specular
är nära noll. Annars kommer ytan att se ut som en metallisk yta och förlorar den diffusa färgen. Ytan kommer att se mer polerad och reflekterande om ShininessExponent
är tillräckligt stor och Specular
är ljus. Annars ser ytan grov ut och återspeglar knappt miljön.
Kända problem
- Den aktuella formeln fungerar inte bra för enkel färgad geometri. Om
Specular
är tillräckligt ljus, blir alla geometrier reflekterande metalliska ytor utan någon färg. Lösningen i det här fallet är att sänkaSpecular
till 30 % från originalet eller att använda konverteringsinställningen fbxAssumeMetallic. - PBR-material har nyligen lagts till i och
3DS Max
verktyg för attMaya
skapa innehåll. De använder anpassade användardefinierade black-box-egenskaper för att skicka den till FBX. Azure Remote Rendering läser inte dessa egenskaper eftersom de inte är dokumenterade och formatet är stängt.