Utilisation d’UVAtlas (Direct3D 9)
Notes
UVAtlas était à l’origine livré dans la bibliothèque d’utilitaireS D3DX9 désormais dépréciée. La dernière version est disponible sur UV Atlas Command-Line Tool (uvatlas.exe).
De nombreuses techniques de rendu et de génération de contenu nécessitent une carte unique et sans chevauchement d’un signal 2D (comme une texture) sur un maillage. Ces techniques sont les suivantes :
- Mappage normal/déplacement
- Simulations PRT d’espace de texture et cartes lumineuses
- Surface painting
- Éclairage d’espace de texture
La génération manuelle d’un mappage UV unique est souvent fastidieuse et fastidieuse; cela est particulièrement vrai lorsque la géométrie d’entrée est complexe et que l’utilisation efficace/faible distorsion de l’espace de texture est souhaitée. L’illustration suivante montre un exemple de maillage et son atlas de texture correspondant.
Cet exemple montre un maillage (à gauche) et la carte normale de l’espace UV correspondante (à droite). Notez que l’atlas de texture contient plusieurs groupes ou clusters de données ; chaque cluster est appelé graphique et, dans l’exemple ci-dessus, affiche les données normales d’une partie du maillage.
Les API UVAtlas D3DX génèrent automatiquement un atlas de texture optimal et sans chevauchement. Les API fournissent des paramètres d’entrée qui vous permettent de :
- Réduisez l’étirement, la distorsion et le sous-échantillonnage des textures.
- Optimisez la densité d’emballage de l’espace de texture pour une utilisation efficace de la mémoire.
- Fournir un échantillonnage homogène sur le maillage, ce qui réduit les discontinuités dans la fréquence d’échantillonnage.
Fonctionnement d’UVAtlas
Les API UVAtlas (voir Fonctions UVAtlas) génèrent un atlas de textures en partitionnant une surface en graphiques et en empaquetant les graphiques dans un atlas de texture. Utilisez D3DXUVAtlasPartition et D3DXUVAtlasPack pour effectuer ces étapes séparément ; ou utilisez D3DXUVAtlasCreate pour partitionner, paramétrer et empaqueter en un seul appel.
- Partitionnement et paramétrage d’un maillage
- Utilisation de tenseurs de métriques intégrés pour contrôler le paramétrage
- Utilisation des données d’adjacence pour les plis spécifiés par l’utilisateur
- Empaquetage de graphiques dans un atlas
Partitionnement et paramétrage d’un maillage
Tout d’abord, le maillage est partitionné en graphiques, puis chaque graphique est paramétré dans son propre espace UV [0,1]. Un cylindre peut être paramétré par un graphique ; une sphère d’autre part nécessite deux graphiques, comme illustré dans l’illustration suivante.
Un maillage qui peut être paramétré avec un graphique unique est classé comme « homéomorphe à un disque », ce qui signifie que vous pouvez étendre un disque infiniment flexible et extensible à l’infini sur le graphique et couvrir parfaitement la géométrie. Cet étirement, appelé homéomorphisme, est une fonction bidirectionnelle ; ce qui signifie que vous pouvez passer d’un paramétrage à l’autre sans perdre d’informations.
Très peu de maillages réels peuvent être paramétrés en deux dimensions sans séparer le maillage en clusters ou graphiques. L’illustration suivante montre un autre exemple de maillage et son atlas de texture correspondant.
Il existe deux paramètres qui déterminent le nombre de graphiques créés :
- Nombre maximal de graphiques autorisés pour l’atlas
- Quantité maximale d’étirement autorisée pour chaque graphique
La quantité de stretch détermine le nombre de graphiques générés et la qualité globale de l’échantillonnage. Étendues comprises entre 0,0 (aucun étirement) et 1,0 (n’importe quelle quantité d’étirement). D3DXUVAtlasCreate et D3DXUVAtlasPartition retournent le stretch maximal généré par l’algorithme. L’illustration suivante montre un autre exemple de maillage et son atlas de texture correspondant.
Utilisation de tenseurs de métriques intégrés pour contrôler le paramétrage
La hiérarchisation de l’espace de texture peut être spécifiée par triangle. Des tenseurs de métriques intégrés peuvent être fournis pour contrôler la façon dont les triangles sont étirés dans l’atlas de l’espace de texture résultant. Les IMT peuvent être spécifiés directement ou calculés en fonction d’un signal d’entrée à l’aide des fonctions de calcul IMT D3DX. Un tenseur de métrique intégré (ou IMT) est une matrice symétrique 2x2 qui décrit la façon dont un triangle est étiré dans l’atlas. Chaque IMT est défini par 3 floats, appelez-les (a,b,c). Ils peuvent être organisés dans une matrice symétrique 2x2 comme suit :
a b
b c
Ensuite, l’IMT peut être utilisé pour rechercher la distance entre deux vecteurs. Donné deux vecteurs v1 et v2, où :
vector v1
vector v2 = v1 + (s,t)
La distance entre v1 et v2 peut être calculée comme suit :
sqrt((s, t) * M * (s, t)^T)
En d’autres termes, le vecteur (s,t) peut être la magnitude de l’étirement dans une direction arbitraire dans l’espace u-v. Dans ce cas, le vecteur s est une direction du premier au deuxième sommet, et t est le produit croisé de la normale et s. Exemple :
(1,1) * (1,1) = (2,2)
(1,1)
IMT(1,1,1) scales by 2
(1,-1) * (1,1) = (0,0)
(1,1)
IMT(2,0,2) scales by 2 with no shearing
Les IMT peuvent être spécifiés directement ou calculés en fonction d’un signal d’entrée à l’aide des fonctions de calcul IMT D3DXComputeIMTFromPerVertexSignal, D3DXComputeIMTFromPerTexelSignal, D3DXComputeIMTFromSignal et D3DXComputeIMTFromTexture_graphics.
Spécifiez les données IMT directement si vous souhaitez contrôler la façon dont l’espace de texture est alloué à des triangles individuels. Ce faisant, allouez plus de zone dans l’atlas à des zones importantes d’un maillage (comme le logo visage ou poitrine d’un personnage, ou les régions d’une scène près du chemin de marche d’un joueur). En spécifiant les IMT qui sont des multiples de la matrice d’identité, les triangles résultants seront mis à l’échelle uniformément dans l’espace de texture.
Par exemple, avec une carte normale haute résolution, vous pouvez calculer IMT pour fournir plus d’espace de texture aux zones de signal de fréquence plus élevée dans la carte normale. Les triangles « plats » (mappés à des régions constantes de la carte normale d’origine) recevront moins d’espace de texture. Les triangles qui contiennent une grande partie des détails de la carte normale recevront plus de zone de texture dans le résultat final. Vous pouvez ensuite rééchantillonner la carte normale dans une texture plus petite, tout en conservant les détails, ou vous pouvez recompiler la carte normale avec le mappage UV plus optimal.
Utilisation des données d’adjacence pour les plis spécifiés par l’utilisateur
Les informations d’adjacence définies par l’utilisateur peuvent être fournies à la fonction de partitionnement pour décrire les plis prédéfinis dans le maillage, et ainsi définir une limite de graphique entre des visages adjacents. Il s’agit d’un moyen simple pour l’appelant de spécifier son propre partitionnement de graphique en tant qu’entrée dans l’algorithme, ce qui affinera davantage les graphiques pour ramener l’étendue sous le maximum autorisé.
Exemple
Cet exemple montre comment utiliser les API UVAtlas et la visionneuse DirectX (Dxviewer.exe) pour rechercher et corriger des discontinuités dans votre modèle qui peuvent affecter considérablement la taille de votre atlas de texture. Vous pouvez obtenir Dxviewer.exe et en savoir plus à partir du Kit de développement logiciel (SDK) DirectX. Dxviewer.exe a été supprimé du Kit de développement logiciel (SDK) DirectX après la version d’août 2009. Pour l’obtenir, vous aurez donc besoin au moins du kit de développement logiciel (SDK) DirectX d’août 2009. Pour plus d’informations sur le Kit de développement logiciel (SDK) DirectX, consultez Où se trouve le Kit de développement logiciel (SDK) DirectX ?.
Supposons que vous avez commencé avec un modèle dans votre logiciel de génération de contenu favori (cet exemple utilise un modèle de tête naine créé dans Maya). Exportez le modèle texturé dans un fichier .x et créez un atlas de texture avec D3DXUVAtlasCreate. L’atlas de textures résultant ressemblerait à l’illustration suivante.
L’atlas comporte 22 graphiques et une étendue maximale de 0,994.
Examinez maintenant le modèle texturé pour voir dans quelle mesure l’atlas de texture est mappé à la géométrie. Pour ce faire, chargez le modèle dans l’outil de visionneuse :
- Ouvrez l’outil visionneuse à partir des utilitaires DirectX.
- Chargez le fichier .x en cliquant sur le bouton Ouvrir.
- Activation de l’option d’affichage par plis en cliquant sur le bouton d’affichage et en sélectionnant Plis dans la fenêtre contextuelle.
L’illustration suivante montre ce que vous devez voir dans l’outil de visionneuse.
Chaque ligne est un pli qui est un bord adjacent entre deux graphiques dans l’atlas de texture. Le nombre de graphiques générés par l’algorithme est dû à de légères différences, peut-être dues à des discontinuités dans les normales. Ces petites différences peuvent être réduites en soudeant les données, c’est-à-dire en forçant les données qui sont presque égales à être égales. Pour souder les normales et les poids de la peau :
- Exécutez l’outil DirectX Ops (dxops.exe) avec la ligne de commande suivante sur le maillage (en remplaçant « modelName.x » par le nom de votre modèle) :
Dxops.exe -s "load 'modelName.x'; Optimize n:2.01 w:2.01 uv0:0.01; save 'newModelName.x';"
Cela compare les normales et les poids de la peau, et là où leur valeur diffère de moins de 2,01, les données sont rendues égales. Les illustrations suivantes montrent un gros plan de l’œil pour voir les plis avant le soudage (à gauche) et les plis après le soudage (à droite) :
Figure 7 : Suppression des plis par soudure
Dans cet exemple, le soudage a supprimé 86 sommets du maillage d’entrée. Avec moins de plis dans le maillage, vous pouvez régénérer l’atlas, comme le montre l’illustration suivante.
L’atlas n’a que 7 graphiques et une étendue maximale d’environ 0,0776. Le nouvel atlas s’intègre désormais dans une texture plus petite (environ 30 % plus petite dans cet exemple).
Empaquetage de graphiques dans un atlas
Une fois qu’un maillage a été partitionné en graphiques paramétrables individuellement, les graphiques doivent être regroupés efficacement dans une seule carte de texture. Cette opération est effectuée comme la deuxième étape de D3DXUVAtlasCreate ou peut être appelée explicitement en appelant D3DXUVAtlasPack.
Les graphiques empaquetés sont séparés par une largeur de gouttière spécifiée par l’utilisateur. La largeur de la gouttière est la quantité de séparation entre les graphiques, et permet l’interpolation et le mappage linéaires pour éviter le rendu des artefacts aux limites du graphique. D3DX fournit une interface pour remplir automatiquement ces gouttières. Pour plus d’informations, consultez ID3DXTextureGutterHelper .
Intégration d’UVAtlas à votre pipeline
En plus d’être appelées par un artiste avant la peinture sur texture, ces fonctions peuvent être intégrées à un pipeline d’art automatisé. Par exemple, un appel UVAtlas peut être émis automatiquement après la mise à jour d’une ressource, avant d’effectuer une simulation PRT ou une passe de mappage normale. Cela évite d’avoir à réparer manuellement le mappage UV d’un objet si la topologie du maillage a été modifiée.
Consultez l’outil uv Atlas Command-Line (uvatlas.exe) pour obtenir des exemples d’utilisation des fonctions UVAtlas.
Rubriques connexes