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,0721DiffuseBrightness
= 0,299 *Diffuse
. Rood2 + 0,587 *Diffuse
. Groen2 + 0.114 *Diffuse
. Blauw2SpecularBrightness
= 0,299 *Specular
. Rood2 + 0,587 *Specular
. Groen2 + 0.114 *Specular
. Blauw2SpecularStrength
= 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
, Specular
en 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: = AlbedoAlpha
Opacity
anders
als TransparencyColor
is gedefinieerd, dan AlbedoAlpha
= 1,0 - ((TransparentColor.Blue
TransparentColor.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 verlagenSpecular
tot 30% van het origineel of om de conversie-instelling fbxAssumeMetallic te gebruiken. - PBR-materialen zijn onlangs toegevoegd aan
Maya
en3DS 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.