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 plus ancien ; pour afficher le style de déclaration de vertex actuel, consultez D3DVERTEXELEMENT9.
Les applications Direct3D peuvent définir des sommets de modèle de plusieurs façons différentes. 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, éliminant les composants qui ne sont pas utilisés. En utilisant uniquement les composants de vertex nécessaires, votre application peut conserver la mémoire et réduire la bande passante de traitement requise pour afficher les modèles. Vous décrivez comment vos sommets sont mis en forme à l’aide d’une combinaison de codes de D3DFVF.
La spécification FVF inclut des formats de taille de point, spécifiés par D3DFVF_PSIZE. Cette taille est exprimée en unités d’espace de caméra pour les sommets non transformés et allumés (TL), et dans les unités d’espace d’appareil pour les sommets de durée de vie.
Les méthodes de rendu de l’interface IDirect3DDevice9 fournissent des applications C++ avec des méthodes qui acceptent une combinaison de ces indicateurs et les utilisent pour déterminer comment restituer des primitives. En fait, ces indicateurs indiquent au système les composants de vertex - position, pondérations de vertex, normales, couleurs et le nombre et le format des coordonnées de texture - votre application utilise et, indirectement, quelles parties du pipeline de rendu que vous souhaitez appliquer à Direct3D. En outre, la présence ou l’absence d’un indicateur de format de vertex particulier communique avec le système sur lequel les 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 connaître 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 aux textures d’être traitées à l’aide de quelques coordonnées ou jusqu’à 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 l’ensemble D3DFVF_TEXCOORDSIZEN 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’utilise 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 sur les 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 vertex avec des sommets non transformés et transformés.
Pour utiliser le mélange de vertex indexé, 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 de D3DFVF_LASTBETA_UBYTE4 et un autre qui ne le fait pas. L’indicateur D3DFVF_XYZB3 est présent lorsque quatre indices de fusion sont utilisés, car vous soustrait toujours la somme des trois premiers du numéro 1 pour obtenir le quatrième (blend₄ = 1 - (blend₁ + blend cumulative + 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
};
La FVF définie 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
};
Rubriques connexes