Mappage de matériaux pour les formats de modèle
Quand une ressource source est convertie en modèle, le convertisseur crée des matériaux pour chaque maillage. Vous pouvez modifier la façon dont les matériaux sont créés. Toutefois, par défaut, la conversion crée des matériaux PBR. Étant donné que chaque format de fichier source, comme FBX, utilise ses propres conventions pour définir les matériaux, ces conventions doivent être mappées aux paramètres de matériau PBR d’Azure Remote Rendering.
Cet article répertorie les mappages précis utilisés pour convertir les matériaux des ressources sources en matériaux de runtime.
glTF
Presque tous les éléments de la spécification glTF 2.0 sont pris en charge dans Azure Remote Rendering, à l’exception de EmissiveFactor et EmissiveTexture.
La table qui suit affiche le mappage :
glTF | Azure Remote Rendering |
---|---|
baseColorFactor | albedoColor |
baseColorTexture | albedoMap |
metallicFactor | metalness |
metallicTexture | metalnessMap |
roughnessFactor | roughness |
roughnessTexture | roughnessMap |
occlusionFactor | occlusion |
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 | - |
Chaque texture dans la spécification glTF peut avoir une valeur texCoord
également prise en charge dans les matériaux Azure Remote Rendering.
Textures incorporées
Les textures incorporées dans les fichiers *.bin ou *.glb sont prises en charge.
Extension glTF prise en charge
En plus de l’ensemble de fonctionnalités de base, Azure Remote Rendering prend en charge les extensions glTF suivantes :
- MSFT_packing_occlusionRoughnessMetallic
- KHR_materials_unlit : correspond aux matériaux de couleur. Pour les matériaux émissifs, il est recommandé d’utiliser cette extension.
- KHR_materials_pbrSpecularGlossiness : au lieu de textures métalliques et approximatives, vous pouvez fournir des textures de brillance spéculaires diffuses. L’implémentation d’Azure Remote Rendering suit directement les formules de conversion de l’extension.
FBX
Le format FBX est propriétaire et les matériaux FBX ne sont pas compatibles avec les matériaux PBR en général. Il utilise une description complexe des surfaces avec bon nombre de paramètres et propriétés uniques qui ne sont pas tous utilisés par le pipeline Azure Remote Rendering.
Important
Le pipeline de conversion de modèle d’Azure Remote Rendering prend uniquement en charge le format FBX 2011 et versions ultérieures.
Le format FBX définissant une approche conservatrice des matériaux, il n’existe que deux types dans la spécification FBX officielle :
- Lambert : rarement utilisé depuis un certain temps déjà, mais toujours pris en charge par transformation en Phong au moment de la conversion.
- Phong : presque tous les matériaux et la plupart des outils de contenu utilisent ce type.
Le modèle Phong est plus précis et c’est le seul utilisé pour les matériaux FBX. Nous l’appelons ci-dessous Matériau FBX.
Maya utilise deux extensions personnalisées pour FBX en définissant des propriétés personnalisées pour PBR et les types Stingray d’un matériau. Ces détails n’étant pas inclus dans la spécification FBX, Azure Remote Rendering ne prend actuellement pas en charge ce format.
Les matériaux FBX utilisant le concept Diffuse-Specular-SpecularLevel, pour passer d’une texture diffuse à une carte Albedo, nous devons calculer les autres paramètres pour les soustraire de structure diffuse.
Toutes les couleurs et textures dans FBX sont dans un espace sRVB (également appelé « espace Gamma ») mais Azure Remote Rendering fonctionne avec un espace linéaire pendant la visualisation et, à la fin du frame, reconvertit tout en espace sRVB. Le pipeline de ressources d’Azure Remote Rendering convertit le tout en espace linéaire pour l’envoyer en tant que données préparées au renderer.
Ce tableau montre comment les textures sont mappées de Matériaux FBX à des matériaux Azure Remote Rendering. Certaines ne sont pas utilisées directement, mais en association avec d’autres textures intervenant dans les formules (par exemple, la texture diffuse) :
FBX | Azure Remote Rendering |
---|---|
AmbientColor | Cartographie d'occlusion |
DiffuseColor | utilisée pour Albedo, Metalness |
TransparentColor | utilisée pour le canal alpha d’Albedo |
TransparencyFactor | utilisée pour le canal alpha d’Albedo |
Opacity | utilisée pour le canal alpha d’Albedo |
SpecularColor | utilisée pour Albedo, Metalness, Roughness |
SpecularFactor | utilisée pour Albedo, Metalness, Roughness |
ShininessExponent | utilisée pour Albedo, Metalness, Roughness |
NormalMap | NormalMap |
Bump | convertie en NormalMap |
EmissiveColor | - |
EmissiveFactor | - |
ReflectionColor | - |
DisplacementColor | - |
Le mappage ci-dessus est la partie la plus complexe de la conversion de matériau en raison des nombreuses hypothèses à effectuer. Nous évoquons ces hypothèses ci-dessous.
Voici certaines définitions utilisées ci-dessous :
Specular
=SpecularColor
*SpecularFactor
SpecularIntensity
=Specular
.Red ∗ 0.2125 +Specular
.Green ∗ 0.7154 +Specular
.Blue ∗ 0.0721DiffuseBrightness
= 0.299 *Diffuse
.Red2 + 0.587 *Diffuse
.Green2 + 0.114 *Diffuse
.Blue2SpecularBrightness
= 0.299 *Specular
.Red2 + 0.587 *Specular
.Green2 + 0.114 *Specular
.Blue2SpecularStrength
= max(Specular
.Red,Specular
.Green,Specular
.Blue)
La formule SpecularIntensity est obtenue à partir d’ici. La formule de luminosité est décrite dans cette spécification.
Rugosité
La valeur Roughness
est calculée à partir des Specular
et ShininessExponent
à l’aide de cette formule. La formule est une approximation de roughness effectuée à partir de l’exposant spéculaire Phong :
Roughness = sqrt(2 / (ShininessExponent * SpecularIntensity + 2))
Metalness
La valeur Metalness
est calculée à partir des valeurs de Diffuse
et de Specular
à l’aide de cette formule de la spécification glTF.
L’idée ici est que nous résolvons l’équation : Ax2 + Bx + C = 0. Fondamentalement, les surfaces diélectriques réfléchissent environ 4 % de la lumière de manière spéculaire, le reste l’étant de manière diffuse. Les surfaces métalliques ne reflètent aucune lumière de manière diffuse, mais toutes de manière spéculaire. Cette formule présente quelques inconvénients, car il n’existe aucun moyen de faire la distinction entre des surfaces brillantes métalliques et plastiques. La plupart du temps, nous supposons que la surface a des propriétés métalliques. Ainsi, il peut arriver que des surfaces en plastique/caoutchouc brillants ne présentent pas l’aspect prévu.
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
est calculé à partir des valeurs Diffuse
, Specular
et Metalness
.
Comme décrit dans la section Metalness, les surfaces diélectriques reflètent environ 4 % de la lumière.
L’idée ici est d’effectuer une interpolation linéaire entre les couleurs Dielectric
et Metal
en utilisant la valeur Metalness
en tant que facteur. Si la valeur de metalness est 0.0
, selon la valeur de specular, soit il s’agit d’une couleur foncée (si la valeur de specular est élevée), soit la valeur de diffuse ne change pas (si aucune valeur de specular n’est présente). Si la valeur de metalness est élevée, la couleur diffuse disparaît en faveur d’une couleur spéculaire.
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);
La valeur AlbedoRGB
a été calculée par la formule ci-dessus, mais le canal alpha requiert des calculs supplémentaires. Le format FBX est vague concernant la transparence, et utilise plusieurs moyens pour la définir. Les différents outils de contenu utilisent des méthodes différentes. L’idée ici est de les unifier en une seule formule. Il a cependant pour effet que certaines ressources sont incorrectement rendues comme transparentes si elles ne sont pas créées de manière commune.
Ceci est calculé à partir des valeurs TransparentColor
, TransparencyFactor
et Opacity
:
si la valeur Opacity
est définie, alors l’utiliser directement : AlbedoAlpha
= Opacity
, sinon
si TransparencyColor
est défini, alors AlbedoAlpha
= 1.0 - ((TransparentColor.Red
+ TransparentColor.Green
+ TransparentColor.Blue
) / 3.0) sinon
si TransparencyFactor
, alors AlbedoAlpha
= 1.0 - TransparencyFactor
La couleur Albedo
finale comporte quatre canaux, combinant AlbedoRGB
avec AlbedoAlpha
.
Résumé
En résumé, la valeur Albedo
est très proche de la valeur Diffuse
d’origine si la valeur Specular
est proche de zéro. Dans le cas contraire, la surface présente l’aspect d’une surface métallique et perd la couleur diffuse. La surface semple plus polie et réfléchissante si la valeur ShininessExponent
est suffisamment élevée et la valeur Specular
brillante. Dans le cas contraire, la surface présente un aspect rugueux et reflète grossièrement l’environnement.
Problèmes connus
- La formule actuelle ne fonctionne pas correctement pour une géométrie colorée simple. Si la valeur
Specular
est suffisamment brillante, toutes les géométries deviennent des surfaces métalliques réfléchissantes sans couleur. La solution de contournement dans ce cas consiste à abaisser la valeurSpecular
à 30 % de la valeur d’origine ou à utiliser le paramètre de conversion fbxAssumeMetallic. - Des matériaux PBR ont été récemment ajoutés aux outils de création de contenu
Maya
et3DS Max
. Ils utilisent des propriétés de boîte noire personnalisées définies par l’utilisateur pour les passer à FBX. Azure Remote Rendering ne lit pas ces propriétés, car elles ne sont pas documentées et le format est propriétaire.