Pavage (Direct3D 9)

Unité Tessellator

L’unité de tessellateur a été améliorée. Vous pouvez maintenant l’utiliser pour :

  • Effectuez une pavage adaptative de toutes les primitives d’ordre supérieur.
  • Recherchez les valeurs de déplacement par vertex à partir d’une carte de déplacement et passez-les à un nuanceur de vertex.
  • Prise en charge de la pavage de rectangle-patch. Cela est spécifié par le biais d’une déclaration de vertex utilisant D3DDECLMETHOD_PARTIALU ou D3DDECLMETHOD_PARTIALV. Si une déclaration de vertex contenant ces méthodes est utilisée pour dessiner un correctif de triangle, IDirect3DDevice9::D rawTriPatch échoue. Pour plus d’informations sur les déclarations de vertex, consultez D3DVERTEXELEMENT9.

Dans DirectX 8.x, ce qu’on appelait ORDER était vraiment le degré. Dans Direct3D 9, le degré est maintenant spécifié par D3DDEGREETYPE.

 // This used to be D3DORDERTYPE and D3DORDER* 
 typedef enum _D3DDEGREETYPE 
 { 
 D3DDEGREE_LINEAR = 1, 
 D3DDEGREE_QUADRATIC = 2, 
 D3DDEGREE_CUBIC = 3, 
 D3DDEGREE_QUINTIC = 5, 
 D3DDEGREE_FORCE_DWORD = 0x7fffffff, 
 } D3DDEGREETYPE; 

Le changement de type de degré a affecté deux autres structures.

typedef struct _D3DRECTPATCH_INFO 
 { 
 UINT StartVertexOffsetWidth; 
 UINT StartVertexOffsetHeight; 
 UINT Width; 
 UINT Height; 
 UINT Stride; 
 D3DBASISTYPE Basis; 
 D3DDEGREETYPE Degree; 
 } D3DRECTPATCH_INFO; 
 typedef struct _D3DTRIPATCH_INFO 
 { 
 UINT StartVertexOffset; 
 UINT NumVertices; 
 D3DBASISTYPE Basis; 
 D3DDEGREETYPE Degree; 
 } D3DTRIPATCH_INFO; 

Les pilotes doivent corriger les erreurs de compilation qui résultent de cette modification lorsqu’ils compilent avec les nouveaux en-têtes. Aucune fonctionnalité ne doit être modifiée.

Pavage adaptatif

La pavage adaptatif peut être appliquée à des primitives d’ordre élevé, y compris les N-patchs, les patchs rectangles et les patchs triangles. Cette fonctionnalité est activée par le D3DRS_ENABLEADAPTIVETESSELLATION et convertit de manière adaptative un correctif, en fonction de la valeur de profondeur du vertex de contrôle dans l’espace oculaire.

Les coordonnées z (Zi) des sommets de contrôle (Vi), qui sont transformées en espace oculaire (Zieye) en effectuant un produit de point avec un vecteur 4, sont utilisées comme valeurs de profondeur. Le vecteur 4D (Mdm) est spécifié par l’application à l’aide de quatre états de rendu (D3DRS_ADAPTIVETESS_X, D3DRS_ADAPTIVETESS_Y, D3DRS_ADAPTIVETESS_Z et D3DRS_ADAPTIVETESS_W). Ce vecteur à 4 peut être la troisième colonne des matrices de monde et de vue concaténées. Il peut également être utilisé pour appliquer une échelle à Zieye.

La fonction permettant de calculer un niveau de pavage Ti à partir de Zieye est supposée être (MaxTessellationLevel/Zieye), ce qui signifie que maxTessellationLevel est le niveau de pavage à Z = 1 dans l’espace oculaire. MaxTessellationLevel est égal à une valeur définie par IDirect3DDevice9::SetNPatchMode pour les N-patches et, pour rt-patches, elle est égale à pNumSegs. Le niveau de pavage est ensuite limité aux valeurs, définies par les deux états de rendu supplémentaires D3DRS_MINTESSELLATIONLEVEL et D3DRS_MAXTESSELLATIONLEVEL, qui définissent les niveaux de pavage minimal et maximal à fixer. Les Ti pour chaque sommet le long d’un bord d’un patch sont moyennement calculés pour obtenir un niveau de pavage pour ce bord. L’algorithme de calcul de Ti pour les correctifs rectangles, les correctifs triangles et les N-patchs diffère en ce qui concerne les sommets de contrôle utilisés pour calculer le niveau de pavage.

Pour les correctifs rectangles avec une base B-spline, les quatre sommets de contrôle les plus externes sont utilisés. Par exemple, avec D3DORDER_CUBIC ordre : les sommets (1,1) et (1,width-2) sont utilisés avec pNumSegs[0], les sommets (1,width-2) et (height-2,height-2) sont utilisés avec pNumSegs[1], les sommets (height-2,width-2) et (1,width-2) sont utilisés avec pNumSegs[2], et les sommets (2,1) et (1,1) sont utilisés avec pNumSegs[3].

Pour les patchs triangles, les vertex de patch d’angle sont utilisés. Avec D3DORDER_CUBIC ordre : les sommets (0) et (9) sont utilisés avec pNumSegs[0], les sommets (9) et (6) sont utilisés avec pNumSegs[1] et les vertex (6) et (0) sont utilisés avec pNumSegs[3].

Pour les N-patchs, les sommets triangles sont utilisés.

Pour les rectangles et les triangles avec une base de Bézier, les sommets de contrôle d’angle sont utilisés.

Contrôle du taux de pavage par vertex. Une application peut éventuellement fournir une seule valeur à virgule flottante positive par sommet, qui peut être utilisée pour contrôler le taux de pavage. Elle est fournie à l’aide de la D3DDECLUSAGE_TESSFACTOR, pour laquelle l’index d’utilisation doit être 0 et le type d’entrée doit être D3DDECLTYPE_FLOAT1. Cette valeur est multipliée par niveau de pavage par sommet.

Math

Le niveau de pavage (Te) d’un bord e, représenté par deux sommets de contrôle (Ve1, Ve2), est calculé comme indiqué ci-dessous :

Vertex Vi: (Xi, Yi, Zi, TFactori (optional)). 
Ze1eye = Ve1 . Mdm 
Ze2eye = Ve2 . Mdm 
Te1 = MaxTessellationLevel * TFactore1 / Ze1eye 
Te2 = MaxTessellationLevel * TFactore2 / Ze2eye 
Te = ( Te1 + Te2 ) / 2; 
if Te > D3DRS_MAXTESSELLATIONLEVEL || Te < 0, then Te = D3DRS_MAXTESSELLATIONLEVEL 
if Te < D3DRS_MINTESSELLATIONLEVEL, then Te = D3DRS_MINTESSELLATIONLEVEL 

Quand D3DRS_ENABLEADAPTIVETESSELLATION a la valeur TRUE, les primitives de triangles (listes de triangles, ventilateurs, bandes) sont dessinées en tant que N-patches, IDirect3DDevice9::SetNPatchMode a défini une valeur inférieure à 1,0.

Modifications de l’API

Nouveaux états de rendu :

 D3DRS_ENABLEADAPTIVETESSELLATION // BOOL 
 D3DRS_MAXTESSELLATIONLEVEL       // Float 
 D3DRS_MINTESSELLATIONLEVEL       // Float 
 D3DRS_ADAPTIVETESS_X             // Float 
 D3DRS_ADAPTIVETESS_Y             // Float 
 D3DRS_ADAPTIVETESS_Z             // Float 
 D3DRS_ADAPTIVETESS_W             // Float 
 
 // D3DRS_MINTESSELLATIONLEVEL and D3DRS_MAXTESSELLATIONLEVEL 
 // cannot be less than 1 

Et leurs valeurs par défaut :

D3DRS_MAXTESSELLATIONLEVEL = 1.0f 
D3DRS_MINTESSELLATIONLEVEL = 1.0f 
D3DRS_ADAPTIVETESS_X = 0.0f 
D3DRS_ADAPTIVETESS_Y = 0.0f 
D3DRS_ADAPTIVETESS_Z = 1.0f 
D3DRS_ADAPTIVETESS_W = 0.0f 
D3DRS_ENABLEADAPTIVETESSELLATION = FALSE 

Nouvelles majuscules matérielles :

D3DDEVCAPS2_ADAPTIVETESSRTPATCH // Can adaptively tessellate RT-patches 
D3DDEVCAPS2_ADAPTIVETESSNPATCH  // Can adaptively tessellate N-patches 

Vertex Pipeline