Fusion géométrique (Direct3D 9)

Direct3D permet à une application d’augmenter le réalisme de ses scènes en rendant des objets polygonaux segmentés - en particulier des caractères - qui ont des articulations harmonieusement mélangées. Ces effets sont souvent appelés skinning. Le système obtient cet effet en appliquant des matrices de transformation du monde supplémentaires à un ensemble unique de sommets pour créer plusieurs résultats, puis en effectuant un mélange linéaire entre les sommets résultants pour créer un ensemble unique de géométrie pour le rendu. L’illustration suivante d’une banane montre ce processus.

illustration du processus de fusion de deux objets avec une texture de banane

L’illustration précédente montre comment vous pouvez imaginer le processus de fusion de géométrie. Dans un seul appel de rendu, le système prend les sommets de la banane, les transforme deux fois - une fois sans modification, et une fois avec une simple rotation - et mélange les résultats pour créer une banane pliée. Le système mélange la position du sommet, ainsi que le sommet normal lorsque l’éclairage est activé. Les applications ne sont pas limitées à deux chemins de fusion ; Direct3D peut mélanger la géométrie entre quatre matrices mondiales, y compris la matrice mondiale standard, D3DTS_WORLD.

Notes

Lorsque l’éclairage est activé, les normales de vertex sont transformées par une matrice de vue du monde inverse correspondante, pondérée de la même façon que les calculs de position de vertex. Le système normalise le vecteur normal résultant si l’état de rendu D3DRS_NORMALIZENORMALS est défini sur TRUE.

 

Sans fusion géométrique, les modèles articulés dynamiques sont souvent rendus en segments. Par instance, envisagez un modèle 3D du bras humain. Dans la vue la plus simple, un bras a deux parties : le bras supérieur qui se connecte au corps, et le bras inférieur, qui se connecte à la main. Les deux sont connectés au coude, et le bras inférieur pivote à ce point. Une application qui restitue un bras peut conserver les données de vertex pour le bras supérieur et inférieur, chacun avec une matrice de transformation mondiale distincte. L'exemple de code suivant illustre ceci.

typedef struct _Arm
{
    VERTEX upper_arm_verts[200];
    D3DMATRIX matWorld_Upper;

    VERTEX lower_arm_verts[200];
    D3DMATRIX matWorld_Lower;
} ARM, *LPARM;

ARM MyArm; // This needs to be initialized.

Pour restituer le bras, deux appels de rendu sont effectués, comme indiqué dans le code suivant.

// Render the upper arm.
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Upper );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );

// Render the lower arm, updating its world matrix to articulate
// the arm by pi/4 radians (45 degrees) at the elbow.
MyArm.matWorld_Lower = RotateMyArm(MyArm.matWorld, pi/4);
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Lower );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );

L’illustration suivante est une banane, modifiée pour utiliser cette technique.

illustration d’une banane mélangée sans mélange géométrique

Les différences entre la géométrie mélangée et la géométrie non ébrétée sont évidentes. Cet exemple est quelque peu extrême. Dans une application réelle, les joints des modèles segmentés sont conçus de sorte que les coutures ne soient pas aussi évidentes. Toutefois, les coutures sont parfois visibles, ce qui présente des défis constants pour les concepteurs de modèles.

La fusion de géométries dans Direct3D offre une alternative au scénario classique de modélisation segmentée. Toutefois, l’amélioration de la qualité visuelle des objets segmentés se fait au détriment des calculs de fusion pendant le rendu. Pour réduire l’impact de ces opérations supplémentaires, le pipeline de géométrie Direct3D est optimisé pour mélanger la géométrie avec le moins de surcharge possible. Les applications qui utilisent intelligemment les services de fusion de géométrie proposés par Direct3D peuvent améliorer le réalisme de leurs personnages tout en évitant de graves répercussions sur les performances.

Fusion des états de transformation et de rendu

La méthode IDirect3DDevice9::SetTransform reconnaît les macros D3DTS_WORLD et D3DTS_WORLDn , qui correspondent aux valeurs qui peuvent être définies par la macro D3DTS_WORLDMATRIX . Ces macros sont utilisées pour identifier les matrices entre lesquelles la géométrie sera fusionnée.

Le type énuméré D3DRENDERSTATETYPE inclut l’état de rendu D3DRS_VERTEXBLEND pour activer et contrôler la fusion géométrique. Les valeurs valides pour cet état de rendu sont définies par le type énuméré D3DVERTEXBLENDFLAGS . Si la fusion géométrique est activée, le format de vertex doit inclure le nombre approprié de pondérations de fusion.

Mélange des pondérations

Une pondération de fusion, parfois appelée pondération bêta, contrôle la mesure dans laquelle une matrice mondiale donnée affecte un sommet. Les pondérations de fusion sont des valeurs à virgule flottante comprises entre 0,0 et 1,0, encodées au format de vertex, où une valeur de 0,0 signifie que le vertex n’est pas fusionné avec cette matrice, et 1.0 signifie que le vertex est entièrement affecté par la matrice.

Les pondérations de fusion géométrique sont encodées au format de vertex, s’affichant immédiatement après la position de chaque sommet, comme décrit dans Fixed Function FVF Codes (Direct3D 9) . Vous communiquez le nombre de pondérations de fusion au format de vertex en incluant l’une des constantes FVF dans la description de vertex que vous fournissez aux méthodes de rendu.

Le système effectue un mélange linéaire entre les résultats pondérés des matrices de fusion. L’équation suivante est la formule de fusion complète.

équation de fusion linéaire, à l’aide de matrices de transformation mondiale

Dans l’équation précédente, vBlend est le vertex de sortie, les éléments v sont les sommets produits par la matrice mondiale appliquée (D3DTS_WORLDn). Les éléments W sont les valeurs de poids correspondantes dans le format de vertex. Un vertex mélangé entre n matrices peut avoir - 1 valeurs de pondération de fusion, une pour chaque matrice de fusion, à l’exception de la dernière. Le système génère automatiquement le poids pour la matrice du dernier monde afin que la somme de tous les poids soit 1.0, exprimée ici en notation sigma. Cette formule peut être simplifiée pour chacun des cas pris en charge par Direct3D, ce qui est illustré dans les équations suivantes.

équations de fusion linéaire pour trois cas de fusion

Il s’agit des formes simplifiées de la formule de fusion complète pour les deux, trois et quatre cas de matrice de fusion.

Notes

Bien que Direct3D inclue des descripteurs FVF pour définir des sommets qui contiennent jusqu’à cinq pondérations de fusion, trois seulement peuvent être utilisés dans cette version de DirectX.

 

Des informations supplémentaires sont contenues dans les rubriques suivantes.

Vertex Pipeline