Materiaaltoewijzing voor modelindelingen

Wanneer een bronasset wordt geconverteerd als een model, maakt het conversieprogramma materialen voor elke mesh. De manier waarop materialen worden gemaakt, kan worden overschreven. Bij de conversie worden echter standaard PBR-materialen gemaakt. Aangezien elke bronbestandsindeling, zoals FBX, eigen conventies gebruikt om materialen te definiëren, moeten deze conventies worden toegewezen aan de PBR-materiaalparameters van Azure Remote Rendering.

Dit artikel bevat de exacte toewijzingen die worden gebruikt om materialen van bronassets te converteren naar runtime-materialen.

glTF

Bijna alles van de glTF 2.0-specificatie wordt ondersteund in Azure Remote Rendering, behalve EmissiveFactor en EmissiveTexture.

In de volgende tabel ziet u de toewijzing:

glTF Azure Remote Rendering
baseColorFactor albedoColor
baseColorTexture albedoMap
metallicFactor metaalheid
metallicTexture metalnessMap
ruwheidFactor Ruwheid
ruwheidTeksture ruwheidsmap
occlusionFactor Occlusie
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
dubbelzijdig isDoubleSided
emissiveFactor -
emissiveTexture -

Elke textuur in glTF kan een texCoord waarde hebben, die ook wordt ondersteund in de Azure Remote Rendering-materialen.

Ingesloten patronen

Texturen die zijn ingesloten in *.bin - of *.glb-bestanden worden ondersteund.

Ondersteunde glTF-extensie

Naast de basisfunctieset biedt Azure Remote Rendering ondersteuning voor de volgende glTF-extensies:

  • MSFT_packing_occlusionRoughnessMetallic
  • KHR_materials_unlit: komt overeen met kleurmaterialen. Voor emissive materialen is het raadzaam om deze extensie te gebruiken.
  • KHR_materials_pbrSpecularGlossiness: In plaats van metallic-ruwheid texturen kunt u diffuse-specular-glossiness texturen bieden. De Implementatie van Azure Remote Rendering volgt rechtstreeks de conversieformules van de extensie.

FBX

De FBX-indeling is closed-source en FBX-materialen zijn in het algemeen niet compatibel met PBR-materialen. FBX maakt gebruik van een complexe beschrijving van oppervlakken met veel unieke parameters en eigenschappen en niet allemaal worden gebruikt door de Azure Remote Rendering-pijplijn.

Belangrijk

De azure Remote Rendering-modelconversiepijplijn ondersteunt alleen FBX 2011 en hoger.

De FBX-indeling definieert een conservatieve benadering voor materialen, er zijn slechts twee typen in de officiële FBX-specificatie:

  • Lambus - Nog niet veel gebruikt voor enige tijd, maar het wordt nog steeds ondersteund door te converteren naar Phong tijdens conversie.
  • Phong - Bijna alle materialen en de meeste inhoudshulpmiddelen gebruiken dit type.

Het Phong-model is nauwkeuriger en wordt gebruikt als het enige model voor FBX-materialen. Daaronder wordt het FBX-materiaal genoemd.

Maya maakt gebruik van twee aangepaste extensies voor FBX door aangepaste eigenschappen te definiëren voor PBR- en Stingray-typen van een materiaal. Deze details zijn niet opgenomen in de FBX-specificatie, dus deze wordt momenteel niet ondersteund door Azure Remote Rendering.

FBX-materialen gebruiken het concept Diffuse-Specular-SpecularLevel, dus om te converteren van een diffuse textuur naar een albedo-kaart moeten we de andere parameters berekenen om ze af te trekken van diffuus.

Alle kleuren en patronen in FBX bevinden zich in de sRGB-ruimte (ook wel Gamma-ruimte genoemd), maar Azure Remote Rendering werkt met lineaire ruimte tijdens visualisatie en aan het einde van het frame wordt alles weer geconverteerd naar sRGB-ruimte. De Azure Remote Rendering-assetpijplijn converteert alles naar lineaire ruimte om deze als voorbereide gegevens naar de renderer te verzenden.

In deze tabel ziet u hoe patronen van FBX-materialen worden toegewezen aan Azure Remote Rendering-materialen. Sommige worden niet rechtstreeks gebruikt, maar in combinatie met andere patronen die deelnemen aan de formules (bijvoorbeeld de diffuse textuur):

FBX Azure Remote Rendering
AmbientColor Kaart voor occlusie
DiffuseColor gebruikt voor Albedo, Metalness
TransparentColor gebruikt voor alfakanaal van Albedo
TransparencyFactor gebruikt voor alfakanaal van Albedo
Dekking gebruikt voor alfakanaal van Albedo
SpecularColor gebruikt voor Albedo, Metaalheid, Ruwheid
SpecularFactor gebruikt voor Albedo, Metaalheid, Ruwheid
ShininessExponent gebruikt voor Albedo, Metaalheid, Ruwheid
Normalmap Normalmap
Bump geconverteerd naar NormalMap
EmissiveColor -
EmissiveFactor -
ReflectionColor -
Verplaatsingskleuren -

De bovenstaande toewijzing is het meest complexe deel van de materiaalconversie, vanwege veel veronderstellingen die moeten worden gemaakt. We bespreken deze veronderstellingen hieronder.

Enkele definities die hieronder worden gebruikt:

  • Specular = SpecularColor * SpecularFactor
  • SpecularIntensity = Specular. Rode ∗ 0,2125 + Specular. Groen ∗ 0,7154 + Specular. Blauwe ∗ 0,0721
  • DiffuseBrightness = 0,299 * Diffuse. Rood2 + 0,587 * Diffuse. Groen2 + 0.114 * Diffuse. Blauw2
  • SpecularBrightness = 0,299 * Specular. Rood2 + 0,587 * Specular. Groen2 + 0.114 * Specular. Blauw2
  • SpecularStrength = max(Specular. Rood, Specular. Groen, Specular. Blauw)

De specularIntensity-formule wordt hier verkregen. De helderheidsformule wordt in deze specificatie beschreven.

Ruwheid

Roughness wordt berekend op basis van Specular en ShininessExponent met behulp van deze formule. De formule is een benadering van ruwheid van de Phong specular exponent:

Roughness = sqrt(2 / (ShininessExponent * SpecularIntensity + 2))

Metaalheid

Metalness wordt berekend op basis van Diffuse en Specular het gebruik van deze formule uit de glTF-specificatie.

Het idee hier is dat we de vergelijking oplossen: Ax2 + Bx + C = 0. Kortom, dilektriciële oppervlakken weerspiegelen ongeveer 4% van het licht op een speculaire manier, en de rest is diffuus. Metalen oppervlakken weerspiegelen geen licht op een diffuse manier, maar allemaal op een speculaire manier. Deze formule heeft enkele nadelen, omdat er geen manier is om onderscheid te maken tussen glanzende plastic en glanzende metalen oppervlakken. We gaan ervan uit dat het oppervlak meestal metalen eigenschappen heeft en dat glanzende plastic/rubber oppervlakken er mogelijk niet naar behoren uitzien.

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 wordt berekend op basis van Diffuse, Specularen Metalness.

Zoals beschreven in de sectie Metaalheid, weerspiegelen diëlektrische oppervlakken ongeveer 4% van het licht.
Het idee hier is om lineair te interpoleren tussen Dielectric en Metal kleuren die waarde als factor gebruiken Metalness . Als metaalheid is 0.0, zal het, afhankelijk van de specular, een donkere kleur zijn (als speculair hoog is) of diffuus niet verandert (als er geen speculair aanwezig is). Als metaalheid een grote waarde is, verdwijnt de diffuse kleur ten gunste van een speculaire kleur.

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 is berekend door de bovenstaande formule, maar het alfakanaal vereist meer berekeningen. De FBX-indeling is vaag over transparantie en heeft veel manieren om deze te definiëren. Verschillende inhoudshulpmiddelen gebruiken verschillende methoden. Het idee hier is om ze te combineren in één formule. Het maakt sommige assets echter onjuist weergegeven als transparant, als ze niet op een gemeenschappelijke manier worden gemaakt.

Dit wordt berekend op basis van TransparentColor, , TransparencyFactor: Opacity

als Opacity dit is gedefinieerd, gebruikt u deze rechtstreeks: = AlbedoAlphaOpacity anders
als TransparencyColor is gedefinieerd, dan AlbedoAlpha = 1,0 - ((TransparentColor.BlueTransparentColor.Red + TransparentColor.Green + ) / 3.0) anders
als TransparencyFactor, dan AlbedoAlpha = 1,0 - TransparencyFactor

De uiteindelijke Albedo kleur heeft vier kanalen, waarbij de AlbedoRGB kleur wordt gecombineerd met de AlbedoAlpha.

Samenvatting

Om hier samen te vatten, Albedo ligt het zeer dicht bij het origineel Diffuse, als Specular het dicht bij nul is. Anders zal het oppervlak eruitzien als een metaaloppervlak en verliest de diffuse kleur. Het oppervlak ziet er mooier en reflecterender uit als ShininessExponent het groot genoeg is en Specular helder is. Anders zal het oppervlak er ruw uitzien en nauwelijks de omgeving weerspiegelen.

Bekende problemen

  • De huidige formule werkt niet goed voor eenvoudige gekleurde geometrie. Als Specular het helder genoeg is, worden alle geometrieën reflecterende metalen oppervlakken zonder kleur. De tijdelijke oplossing in dit geval is om te verlagen Specular tot 30% van het origineel of om de conversie-instelling fbxAssumeMetallic te gebruiken.
  • PBR-materialen zijn onlangs toegevoegd aan Maya en 3DS Max hulpprogramma's voor het maken van inhoud. Ze gebruiken aangepaste door de gebruiker gedefinieerde black-box-eigenschappen om deze door te geven aan FBX. Deze eigenschappen worden niet gelezen in Azure Remote Rendering omdat ze niet worden gedocumenteerd en de indeling gesloten bron is.

Volgende stappen