Pavage (Direct3D 9)
Tessellator Unit
L’unité tessellator 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 du pavage rectangle-patch. Cela est spécifié par le biais d’une déclaration de vertex à l’aide de D3DDECLMETHOD_PARTIALU ou de D3DDECLMETHOD_PARTIALV. Si une déclaration de vertex contenant ces méthodes est utilisée pour dessiner un correctif 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;
La modification du 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 résultant 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 de haut ordre, notamment des correctifs N, des correctifs rectangles et des correctifs de triangle. Cette fonctionnalité est activée par les D3DRS_ENABLEADAPTIVETESSELLATION et tessellates 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 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 du monde concaténé et des matrices d’affichage. Il peut également être utilisé pour appliquer une échelle à Zieye.
La fonction permettant de calculer un niveau de pavage Ti 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 correctifs N et, pour les correctifs RT, il est égal à pNumSegs. Le niveau de pavage est ensuite limité aux valeurs, défini par les deux états de rendu supplémentaires D3DRS_MINTESSELLATIONLEVEL et D3DRS_MAXTESSELLATIONLEVEL, qui définissent les niveaux de pavage minimal et maximal à limiter. Les Ti pour chaque sommet le long d’un bord d’un patch sont moyens d’obtenir un niveau de pavage pour ce bord. L’algorithme de calcul ti pour les correctifs rectangles, les correctifs triangles et les correctifs N diffère dans 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 (hauteur-2,height-2) sont utilisés avec pNumSegs[2]. 1], les sommets (hauteur-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 correctifs de triangle, les sommets des correctifs de coin 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 sommets (6) et (0) sont utilisés avec pNumSegs[3].
Pour les correctifs N, les sommets de triangle sont utilisés.
Pour les patchs rectangle et triangle avec une base bezier, les sommets de contrôle d’angle sont utilisés.
Contrôle de taux de pavage par vertex. Une application peut éventuellement fournir une valeur à virgule flottante positive unique par vertex, qui peut être utilisée pour contrôler le taux de pavage. Cela est fourni à l’aide du D3DDECLUSAGE_TESSFACTOR, pour lequel l’index d’utilisation doit être 0 et le type d’entrée doit être D3DDECLTYPE_FLOAT1. Ceci est multiplié par le niveau de pavage par vertex.
Mathématiques
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
Lorsque D3DRS_ENABLEADAPTIVETESSELLATION est TRUE, les primitives de triangle (listes de triangles, ventilateurs, bandes) sont dessinées sous forme de N-patches, IDirect3DDevice9 ::SetNPatchMode a défini la 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 limites matérielles :
D3DDEVCAPS2_ADAPTIVETESSRTPATCH // Can adaptively tessellate RT-patches
D3DDEVCAPS2_ADAPTIVETESSNPATCH // Can adaptively tessellate N-patches
Rubriques connexes