Partager via


Prise en charge du maillage dans D3DX (Direct3D 9)

D3DX est une bibliothèque d’utilitaires qui fournit des services d’assistance. Il s’agit d’une couche au-dessus du composant Direct3D.

Maillages

D3DX implémente la construction d’un maillage pour charger, manipuler et restituer le contenu de fichiers .x. Globalement, un maillage est un ensemble de vertex définissant les géométries et un ensemble d’index définissant les faces. Il existe plusieurs types de maillages.

ID3DXBaseMesh fournit les bases. ID3DXMesh hérite d’ID3DXBaseMesh et y ajoute une optimisation du maillage à l’aide du cache de vertex par processeur. ID3DXSkinInfo prend en charge les maillages faisant l’objet d’un skinning.

ID3DXBaseMesh fournit des méthodes pour manipuler et interroger les objets de maillage ID3DXMesh, qui héritent du maillage de base. Cela comprend les opérations d’adjacence, la récupération du tampon de géométrie, les opérations de verrouillage/déverrouillage (vertex et index) et les informations de copie, de rendu, de face et de vertex.

Remarque

Les interfaces ID3DXPMesh et ID3DXSPMesh (pour prendre en charge les maillages progressifs et simplifiés, respectivement) disponibles dans les versions antérieures de Direct3D 9 ont été supprimées.

 

Architecture d’un maillage

Un maillage contient les données d’un modèle complexe. Il s’agit d’un conteneur de données abstrait qui contient des ressources telles que des textures et des matériaux, ainsi que des attributs tels que des données de position et des données d’adjacence. Il existe plusieurs opérations de maillage qui améliorent les performances de dessin et l’apparence d’une surface. Il existe également un certain nombre d’autres concepts de maillage qui affectent les fonctionnalités des opérations de maillage. Comprendre ces concepts de maillage afin de pouvoir les appliquer améliore les performances de maillage.

Données d’objet de maillage

Un maillage contient un tampon vertex, un tampon index et un tampon attribut.

  • Le tampon vertex contient les données vertex, qui représentent les vertex du maillage.
  • Le tampon index contient les index de vertex pour accéder au tampon vertex. Cela peut réduire la taille du tampon vertex en réduisant les vertex en double. Seul un maillage indexé utilise le tampon index. Si un maillage est constitué d’une liste de triangles, par exemple, il n’utilise pas le tampon index.
  • Le tampon attribut contient des données d’attribut. Les attributs sont les propriétés des vertex de maillage, sans ordre particulier. Un maillage D3DX stocke les attributs dans un groupe de DWORDS pour chaque face.

Tables d’attributs

Une table d’attributs est une représentation concise du contenu d’un tampon attribut. Les tables d’attributs peuvent être créées en appelant l’une des méthodes Optimize avec D3DXMESHOPT_ATTRSORT, en verrouillant le tampon attribut et en le remplissant avec des données, ou en appelant SetAttributeTable. Un maillage contient une table d’attributs lorsqu’il est réorganisé en groupes. Cela se produit lorsque la méthode Optimize est appelée, en supposant qu’une option de tri d’attribut (D3DXMESHOPT_ATTRSORT ou supérieur) soit fournie. Les maillages D3DX utilisent des listes de triangles indexées et sont donc dessinés avec IDirect3DDevice9::DrawIndexedPrimitive.

Les tables d’attributs sont créées suite à l’appel de la méthode Optimize. Les faces n’ont pas besoin d’être adjacentes parce que la méthode Optimize les réorganise pour qu’elles le soient. Par exemple, les mains d’un maillage humain peuvent utiliser le même attribut. L’ID permet de trier les faces en groupes. Les maillages à partir de fichiers .x génèrent automatiquement les attributs pour les propriétés de matériau et de texture. Vous devez appeler Optimize(ATTRSORT) ou, encore mieux, Optimize(VERTEXCACHE) pour obtenir de bonnes performances. Les fonctions de chargement tentent de présenter les données sous la forme exacte dans laquelle elles ont été enregistrées. Si vous utilisez un maillage basé sur un tampon vertex/index, l’API de maillage fournit des fonctions d’optimisation et des transformations de skinning avec peu de traitement.

Les types d’optimisation sont cumulatifs, du moins optimal (D3DXMESHOPT_COMPACT) au plus optimal (D3DXMESHOPT_IGNOREVERTS). D3DXMESHOPT_STRIPREORDER effectue un tri de compactage et d’attribut. D3DXMESHOPT_VERTEXCACHE est toujours recommandé, même sur les appareils sans véritable cache de vertex.

Données d’application

Les données d’application sont des données de maillage gérées par une application. Il existe un lien étroit entre les données de vertex de maillage et les données gérées par ces tampons.

Le tampon matériaux contient n matériaux. Les matériaux sont retournés par la fonction Load lorsque le fichier .x est chargé. Chaque sous-ensemble peut avoir ses propres matériaux et textures. Le tampon matériaux est statique.

Le tampon adjacence contient des informations sur les bords, les faces et les faces adjacentes. Certaines opérations de maillage dépendent du fait de savoir quelles faces sont adjacentes les unes aux autres. Ces informations, appelées données d’adjacence, sont conservées dans un tampon adjacence. Elles ne font pas partie du maillage, mais elles sont conservées par l’application et doivent être fournies aux méthodes de maillage si nécessaire.

Le tampon d’instances d’effet contient une liste d’instances d’effet. Une instance d’effet stocke l’état. Ces informations d’état sont utilisées pour initialiser le pipeline. Une instance d’effet contient des paires nom-valeur dans un effet.

À propos des maillages avancés

Les maillages optimisés s’appuient sur la fonctionnalité de maillage de base et ajoutent une fonctionnalité d’optimisation du cache de vertex avec deux méthodes : Optimize, qui crée un maillage, et OptimizeInPlace, qui modifie le maillage d’origine.

D3DXGeneratePMesh utilise l’algorithme de simplification D3DX pour générer un maillage progressif à partir du maillage d’entrée. D3DXSimplifyMesh génère un maillage standard du niveau de détail donné à partir d’un maillage d’entrée à l’aide du même algorithme de simplification. L’utilisateur contrôle la métrique d’erreur utilisée par le biais des poids spécifiés par composant de vertex et des poids spécifiés par vertex. Les poids par composant sont multipliés par rapport à cette partie d’erreur de composants calculée par réduction de bord. Les poids par vertex sont multipliés par rapport à la valeur de la métrique d’erreur déterminée pour la suppression de ce vertex. Par exemple, si vous souhaitez qu’un vertex ne soit jamais supprimé, définissez le poids de ce vertex spécifique avec une grande valeur. À l’inverse, si vous souhaitez qu’il soit supprimé plus tôt, définissez-le avec une petite valeur (inférieure à 1).

ID3DXSkinInfo prend en charge les personnages faisant l’objet d’un skinning. Un personnage faisant l’objet d’un skinning est défini par un ensemble de maillages et un ensemble d’os qui affectent les vertex des maillages. Les os sont représentés sous la forme d’une hiérarchie de transformation. Pour chaque maillage, il existe une matrice pour chaque os qui l’affecte, qui transforme le maillage en espace de coordonnées local de l’os. Cette matrice est la transformation os-espace de l’os pour le maillage. Cela est défini au moment où le squelette est associé au maillage dans le processus de création.

Skinning

Le skinning est une technique permettant de transformer des vertex de maillage en utilisant les os. Les os sont généralement organisés dans un squelette hiérarchique, comme les os d’un corps humain. Les vertex d’objet sont ensuite associés aux os, comme pour relier la peau aux os. Lorsque les os se transforment, la peau est également transformée.

Les maillages de skinning utilisent les os pour influencer sur un certain nombre de vertex. Les données de transformation d’os sont fournies par l’utilisateur pour influencer la mise à l’échelle, la rotation et la translation (SRT, scaling, rotation, translation) des os. Le maillage utilise les os transformés pour influencer les vertex associés aux os. Les palettes sont des tableaux de transformations SRT. Les palettes sont souvent implémentées en tant que matrices, mais elles peuvent contenir des valeurs SRT.

Troncation d’un maillage progressif

Les zones de détail faibles peuvent se permettre de perdre des vertex qui ne changent pas l’apparence rendue de la surface. C’est particulièrement vrai pour les objets lorsqu’ils s’éloignent de la caméra. C’est ce qu’on appelle le niveau de détail. Les utilisateurs disposent de contrôles de rendu au niveau de l’API pour définir le niveau de détail afin d’optimiser l’efficacité du rendu.

Les objets d’un maillage progressif commencent par un grand nombre de faces et utilisent la simplification pour réduire ce nombre. Un maillage progressif qui est indépendant de l’affichage est appelé maillage VIPM (view-independent progressive mesh).

Une autre façon de réduire le nombre de faces consiste à les tronquer. En fait, cela revient à supprimer des vertex et des faces du maillage. La troncation peut être effectuée à l’extrémité supérieure (pour limiter le nombre maximal de faces) ou à l’extrémité inférieure (pour limiter le nombre minimal de faces.) La troncation améliore les performances de dessin, mais il faut faire attention à préserver la qualité visuelle. La troncation est illustrée dans l’exemple de SDK de maillage progressif.

Pour les zones très visibles, la résolution peut être augmentée à l’aide d’un niveau de détail progressif (PLOD, progressive level of detail). Il s’agit d’une technique permettant de diviser une face en deux.

Maillages de patchs

Deux types spécifiques de maillages de patchs sont également pris en charge : les patchs rectangle et triangle. Le maillage de patchs rectangles est un maillage de patchs dont les points de contrôle sont disposés dans une séquence rectangulaire enroulée. Les patchs rectangle et triangle sont utilisés pour créer des surfaces de très bonne qualité. Ils ne sont pas aussi souvent utilisés que les maillages de triangles.

D3DX