Dela via


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,0721
  • DiffuseBrightness = 0,299 * Diffuse. Röd2 + 0,587 * Diffuse. Grön2 + 0,114 * Diffuse. Blå2
  • SpecularBrightness = 0,299 * Specular. Röd2 + 0,587 * Specular. Grön2 + 0,114 * Specular. Blå2
  • SpecularStrength = 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, Specularoch 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.BlueTransparentColor.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änka Specular 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 att Maya 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.

Nästa steg