Pipeline de transformation Direct3D
Cet article fournit une explication technique pour les développeurs d’applications Direct3D sur la façon de définir les paramètres du pipeline de transformation Direct3D par la manipulation directe de matrices Direct3D.
Vue d’ensemble
Direct3D utilise trois transformations pour modifier vos coordonnées de modèle 3D en coordonnées de pixels (espace d’écran). Ces transformations sont la transformation mondiale, la transformation de vue et la transformation de projection.
La transformation mondiale contrôle la façon dont les coordonnées de modèle sont transformées en coordonnées mondiales. La transformation mondiale peut inclure des traductions, des rotations et des mises à l’échelle, mais elle ne s’applique pas aux lumières. Pour plus d’informations sur l’utilisation des transformations mondiales, consultez Transformation mondiale.
La transformation d’affichage contrôle la transition des coordonnées du monde à « l’espace de la caméra », déterminant la position de la caméra dans le monde. Pour obtenir un exemple d’utilisation des transformations d’affichage, consultez Transformation d’affichage.
La transformation de projection modifie la géométrie de l’espace de la caméra en « espace clip » et applique une distorsion de perspective. Le terme « espace de clip » fait référence à la façon dont la géométrie est rogné sur le volume d’affichage pendant cette transformation. Pour obtenir un exemple d’utilisation des transformations de projection, consultez Transformation de projection.
Enfin, la géométrie dans l’espace clip est transformée en coordonnées de pixels (espace d’écran). Cette transformation est contrôlée par les paramètres de la fenêtre d’affichage.
Le découpage et la transformation des sommets doivent avoir lieu dans un espace homogène (autrement dit, espace dans lequel le système de coordonnées comprend un quatrième élément), mais le résultat final pour la plupart des applications doit être des coordonnées tridimensionnelles (3D) non homogènes définies dans « espace d’écran ». Cela signifie que les sommets d’entrée et le volume de découpage doivent être traduits dans un espace homogène pour effectuer le découpage, puis convertis en espace non homogène à afficher.
Les trois transformations Direct3D(monde, vue et projection) sont définies par des matrices Direct3D. Une matrice Direct3D est une matrice homogène 4x4 définie par une structure D3DMATRIX . Bien que les matrices Direct3D ne soient pas des objets standard, elles ne sont pas représentées par une interface COM, vous pouvez les créer et les définir comme vous le feriez pour n’importe quel autre objet Direct3D. Pour plus d’informations sur les matrices Direct3D, consultez Transformations.
Pipeline de transformation
Si un sommet dans la coordonnée du modèle est donné par Pm = (Xm, Ym, Zm, 1), les transformations illustrées dans la figure suivante sont appliquées aux coordonnées de l’écran de calcul Ps = (Xs, Ys, Zs, Ws).
Voici les descriptions des étapes qui sont illustrées dans la figure précédente :
La matrice mondiale Mworld transforme les sommets de l’espace de modèle en espace mondial. Cette matrice est définie par :
d3dDevice->SetTransform (D3DTRANSFORMSTATE_WORLD, matrix address)
L’implémentation de Direct3D suppose que la dernière colonne de cette matrice est (0, 0, 0, 1). Aucune erreur n’est retournée si l’utilisateur spécifie une matrice avec une autre dernière colonne, mais que l’éclairage et le brouillard sont incorrects.
Afficher la matrice Mview transforme les sommets de l’espace du monde à l’espace caméra. Cette matrice est définie par :
d3dDevice->SetTransform (D3DTRANSFORMSTATE_VIEW, matrix address)
L’implémentation de Direct3D suppose que la dernière colonne de cette matrice est (0, 0, 0, 1). Aucune erreur n’est retournée si l’utilisateur spécifie une matrice avec une dernière colonne différente, mais que l’éclairage et le brouillard sont incorrects.
La matrice de projection Mproj transforme les sommets de l’espace de la caméra en espace de projection. Cette matrice est définie par :
d3dDevice->SetTransform (D3DTRANSFORMSTATE_PROJECTION, matrix address)
La dernière colonne de la matrice de projection doit être (0, 0, 1, 0) ou (0, 0, a, 0) pour des effets de brouillard et d’éclairage corrects; Le formulaire (0, 0, 1, 0) est préférable.
Le volume de découpage pour tous les points Xp = (Xp, Yp, Zp, Wp) dans l’espace de projection est défini comme suit :
-Wp < Xp <= Wp -Wp < Yp <= Wp 0 < Zp <= Wp
Tous les points qui ne répondent pas à ces équations seront coupés.
Si un volume d’affichage est défini comme suit :
- Largeur de la fenêtre sw-screen dans l’espace de la caméra dans le plan de découpage proche
- Hauteur de fenêtre sh-screen dans l’espace de la caméra dans le plan de découpage proche
- Distance Zn au plan de découpage le long des axes Z dans l’espace de la caméra
- Distance de Zf au plan de découpage lointain le long des axes Z dans l’espace de la caméra
une matrice de projection de perspective peut alors être écrite comme suit :
où les Mij sont membres de Mproj.
Pour la projection orthogonale, nous avons :
Direct3D suppose que la matrice de projection de perspective a la forme suivante :
Si la matrice de projection de perspective n’a pas cette forme, il y aura des artefacts. Par exemple, le brouillard de table ne fonctionnera pas.
Direct3D permet à l’utilisateur de modifier le volume du clip comme suit :
Cela peut être réécrit comme suit :
où :
Cx, Cy - dvClipX, dvClipY from D3DVIEWPORT9 Cw, Ch - dvClipWidth, dvClipHeight from D3DVIEWPORT9 Zmin, Zmax - dvMinZ, dvMaxZ from D3DVIEWPORT9
Cette transformation peut fournir une précision accrue et équivaut à la mise à l’échelle et au déplacement du volume de découpage.
La matrice Mclip correspondante est :
Un sommet est transformé par :
dvClipWidth = 2 dvClipHeight = 2 dvClipX = -1 dvClipY = 1 dvMinZ = 0 dvMaxZ = 1
Si vous ne souhaitez pas mettre à l’échelle le volume de clip, vous pouvez définir les paramètres de la fenêtre d’affichage sur les valeurs par défaut :
(Xc, Yc, Zc, Wc) = (Xp, Yp, Zp, Wp) * Mclip
La phase de découpage est facultative si l’utilisateur spécifie l’indicateur D3DDP_DONOTCLIP dans un appel DrawPrimitive. Dans ce cas, toutes les matrices (Y compris les Mvs) peuvent être combinées.
La matrice d’échelle de fenêtre d’affichage Mvs met à l’échelle les coordonnées pour qu’elles se trouvent dans la fenêtre de fenêtre d’affichage et retourne l’axe Y de haut en bas :
où :
dwX, dwY - viewport offsets in pixels from D3DVIEWPORT9 dwWidth, dwHeight - viewport width and height in pixels from D3DVIEWPORT9
Enfin, les coordonnées d’écran sont calculées et passées au rastériseur :
Conseils d’utilisation
Voici quelques conseils pour utiliser le pipeline de transformation Direct3D :
La dernière colonne des matrices monde et vue doit être (0, 0, 0, 1), sinon l’éclairage sera incorrect.
Définissez les paramètres de la fenêtre d’affichage pour générer une matrice Mclip d’identité, sauf si vous comprenez exactement ce pour quoi elle est nécessaire.
dvClipWidth = 2 dvClipHeight = 2 dvClipX = -1 dvClipY = 1 dvMinZ = 0 dvMaxZ = 1