Codes FVF de fonction fixe (Direct3D 9)

Un code FVF décrit le contenu des sommets stockés entrelacés dans un seul flux de données. Il spécifie généralement les données à traiter par le pipeline de traitement de vertex de fonction fixe. Il s’agit d’une déclaration de vertex de style ancien ; pour voir le style de déclaration de vertex actuel, consultez D3DVERTEXELEMENT9.

Les applications Direct3D peuvent définir des sommets de modèle de différentes manières. La prise en charge des définitions de vertex flexibles, également appelées formats de vertex flexibles ou codes de format de vertex flexibles, permet à votre application d’utiliser uniquement les composants de vertex dont elle a besoin, en éliminant les composants qui ne sont pas utilisés. En utilisant uniquement les composants de vertex nécessaires, votre application peut économiser de la mémoire et réduire la bande passante de traitement nécessaire au rendu des modèles. Vous décrivez comment vos sommets sont mis en forme à l’aide d’une combinaison de codes D3DFVF .

La spécification FVF inclut des formats pour la taille de point, spécifiée par D3DFVF_PSIZE. Cette taille est exprimée en unités d’espace de caméra pour les sommets non transformés et éclairés (TL), et en unités d’espace d’appareil pour les sommets TL.

Les méthodes de rendu de l’interface IDirect3DDevice9 fournissent aux applications C++ des méthodes qui acceptent une combinaison de ces indicateurs et les utilisent pour déterminer comment restituer des primitives. Fondamentalement, ces indicateurs indiquent au système quels composants de vertex (position, pondérations de fusion de vertex, normal, couleurs, ainsi que le nombre et le format des coordonnées de texture) votre application utilise et, indirectement, quelles parties du pipeline de rendu vous souhaitez que Direct3D leur applique. En outre, la présence ou l’absence d’un indicateur de format de vertex particulier indique au système quels champs de composant de vertex sont présents en mémoire et que vous avez omis.

Pour déterminer les limitations de l’appareil, vous pouvez interroger un appareil pour obtenir les valeurs de D3DFVFCAPS_DONOTSTRIPELEMENTS et de D3DFVFCAPS_TEXCOORDCOUNTMASK dans le membre FVFCaps de D3DCAPS9.

Les coordonnées de texture peuvent être déclarées dans différents formats, ce qui permet de traiter les textures à l’aide d’une coordonnée ou de quatre coordonnées de texture (pour les coordonnées de texture projetées en 2D). Pour plus d’informations, consultez Formats de coordonnées de texture (Direct3D 9). Utilisez le D3DFVF_TEXCOORDSIZEN jeu de macros pour créer des modèles de bits qui identifient les formats de coordonnées de texture utilisés par votre format de vertex.

Aucune application n’utilisera chaque composant. Les champs homogènes réciproques W (RHW) et les champs normaux de vertex s’excluent mutuellement. La plupart des applications n’essaieront pas non plus d’utiliser les huit ensembles de coordonnées de texture, mais Direct3D dispose de cette capacité. Il existe plusieurs restrictions quant aux indicateurs que vous pouvez utiliser avec d’autres indicateurs. Par exemple, vous ne pouvez pas utiliser les indicateurs D3DFVF_XYZ et D3DFVF_XYZRHW ensemble, car cela indiquerait que votre application décrit la position d’un sommet avec des sommets non transformés et transformés.

Pour utiliser le mélange de sommets indexés, l’indicateur D3DFVF_LASTBETA_UBYTE4 doit apparaître à la fin de la déclaration FVF. La présence de cet indicateur indique que le cinquième poids de fusion sera traité comme un DWORD au lieu de float. Pour plus d’informations, consultez Fusion de vertex indexés (Direct3D 9).

Les exemples de code suivants montrent la différence entre un code FVF qui utilise l’indicateur D3DFVF_LASTBETA_UBYTE4 et un code qui ne le fait pas. L’indicateur D3DFVF_XYZB3 est présent lorsque quatre index de fusion sont utilisés, car vous soustrayez toujours la somme des trois premiers du nombre 1 pour obtenir le quatrième (blend₄ = 1 - (blend₁ + blend₂ + blend₃)).

#define D3DFVF_BLENDVERTEX (D3DFVF_XYZB3|D3DFVF_NORMAL|D3DFVF_TEX1)

struct BLENDVERTEX
{
    D3DXVECTOR3 v;       // Referenced as v0 in the vertex shader
    FLOAT       blend1;  // Referenced as v1.x in the vertex shader
    FLOAT       blend2;  // Referenced as v1.y in the vertex shader
    FLOAT       blend3;  // Referenced as v1.z in the vertex shader
                         // v1.w = 1.0 - (v1.x + v1.y + v1.z)
    D3DXVECTOR3 n;       // Referenced as v3 in the vertex shader
    FLOAT       tu, tv;  // Referenced as v7 in the vertex shader
};

Le FVF défini ci-dessous utilise l’indicateur D3DFVF_LAST_UBYTE4.

#define D3DFVF_BLENDVERTEX (D3DFVF_XYZB4 | D3DFVF_LASTBETA_UBYTE4 |D3DFVF_NORMAL|D3DFVF_TEX1)

struct BLENDVERTEX
{
    D3DXVECTOR3 v;       // Referenced as v0 in the vertex shader
    FLOAT       blend1;  // Referenced as v1.x in the vertex shader
    FLOAT       blend2;  // Referenced as v1.y in the vertex shader
    FLOAT       blend3;  // Referenced as v1.z in the vertex shader
                         // v1.w = 1.0 - (v1.x + v1.y + v1.z)
    DWORD       indices; // Referenced as v2.xyzw in the vertex shader 
    D3DXVECTOR3 n;       // Referenced as v3 in the vertex shader
    FLOAT       tu, tv;  // Referenced as v7 in the vertex shader
};

Déclaration de vertex