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
Rubriques connexes