Utilisation de la fusion de vertex indexés (Direct3D 9)
Les états de transformation 256-511 sont réservés pour stocker jusqu’à 256 matrices qui peuvent être indexées à l’aide d’index 8 bits. Utilisez la macro D3DTS_WORLDMATRIX pour mapper les index 0 à 255 aux états de transformation correspondants. L’exemple de code suivant montre comment utiliser la méthode IDirect3DDevice9::SetTransform pour définir la matrice à l’état de transformation numéro 256 en matrice d’identité.
D3DMATRIX matBlend1;
D3DXMatrixIdentity( &matBlend1 );
m_pD3DDevice->SetTransform( D3DTS_WORLDMATRIX(0), &matBlend );
Pour activer ou désactiver le mélange de vertex indexés, définissez l’état de rendu D3DRS_INDEXEDVERTEXBLENDENABLE sur TRUE. Lorsque l’état de rendu est activé, vous devez passer des index de matrice en tant que DWORD compressés avec chaque sommet. Lorsque cet état de rendu est désactivé et que le mélange de vertex est activé, cela revient à avoir les index de matrice 0, 1, 2 et 3 dans chaque sommet. L’exemple de code ci-dessous utilise la méthode IDirect3DDevice9::SetRenderState pour activer le mélange de vertex indexés.
m_pD3DDevice->SetRenderState( D3DRS_INDEXEDVERTEXBLENDENABLE, TRUE );
Pour activer ou désactiver le mélange de vertex, définissez l’état de rendu IDirect3DDevice9::SetRenderState sur une valeur autre que D3DRS_DISABLE du type énuméré D3DVERTEXBLENDFLAGS . Si cet état de rendu n’est pas défini sur D3DRS_DISABLE, vous devez passer le nombre de poids requis pour chaque sommet. L’exemple de code suivant utilise IDirect3DDevice9::SetRenderState pour activer la fusion de vertex avec trois poids pour chaque vertex.
m_pD3DDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_3WEIGHTS );
Détermination de la prise en charge du mélange de vertex indexés
Pour déterminer la taille maximale de la matrice de fusion de vertex indexée, case activée le membre MaxVertexBlendMatrixIndex de la structure D3DCAPS9. L’exemple de code ci-dessous utilise la méthode IDirect3DDevice9::GetDeviceCaps pour récupérer cette taille.
D3DCAPS9 d3dCaps;
m_pD3DDevice->GetDeviceCaps( &d3dCaps );
IndexedMatrixMaxSize = d3dCaps.MaxVertexBlendMatrixIndex;
Si la valeur définie dans MaxVertexBlendMatrixIndex est 0, l’appareil ne prend pas en charge les matrices indexées.
Notes
Lorsque le traitement des vertex logiciels est utilisé, 256 matrices peuvent être utilisées pour le mélange de vertex indexé, avec ou sans fusion normale.
Passage d’index de matrice à Direct3D
Les index de matrice mondiale peuvent être passés à Direct3D à l’aide de nuanceurs de vertex hérités (FVF) ou de déclarations.
L’exemple de code ci-dessous montre comment utiliser des nuanceurs de vertex hérités.
struct VERTEX
{
float x,y,z;
float weight;
DWORD matrixIndices;
float normal[3];
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZB2 | D3DFVF_LASTBETA_UBYTE4 |
D3DFVF_NORMAL);
Lorsqu’un nuanceur de vertex hérité est utilisé, les index de matrice sont passés avec les positions de vertex à l’aide d’indicateurs D3DFVF_XYZBn. Les index de matrice sont passés sous forme d’octets à l’intérieur d’un DWORD et doivent être présents immédiatement après la dernière pondération de vertex. Les pondérations de vertex sont également passées à l’aide de D3DFVF_XYZBn. Un DWORD packé contient index3, index2, index1 et index0, où index0 se trouve dans l’octet le plus bas du DWORD. Le nombre d’index de matrice mondiale utilisés est égal au nombre passé au nombre de matrices utilisées pour la fusion, tel que défini par D3DRS_VERTEXBLEND.
Lorsqu’une déclaration est utilisée, D3DVSDE_BLENDINDICES définit le registre de vertex d’entrée à partir duquel obtenir des index de matrice. Les index de matrice doivent être passés en tant que D3DVSDT_UBYTE4.
L’exemple de code ci-dessous montre comment utiliser des déclarations. Notez que l’ordre des composants n’est plus important, sauf si vous utilisez un nuanceur de vertex à fonction fixe.
Voici la déclaration de vertex.
struct VERTEX
{
float x,y,z;
float weight;
DWORD matrixIndices;
float normal[3];
}
Voici la déclaration de registre correspondante.
// Create the shader declaration.
D3DVERTEXELEMENT9 decl[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
{ 0, 12, D3DDECLTYPE_FLOAT1, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDWEIGHT, 0 },
{ 0, 16, D3DDECLTYPE_UBYTE4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDINDICES, 0 },
{ 0, 20, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 },
D3DDECL_END()
};
Rubriques connexes