Uso della fusione dei vertici indicizzati (Direct3D 9)
Gli stati di trasformazione 256-511 sono riservati per archiviare fino a 256 matrici che possono essere indicizzate usando indici a 8 bit. Usare la macro D3DTS_WORLDMATRIX per eseguire il mapping degli indici 0-255 agli stati di trasformazione corrispondenti. Nell'esempio di codice seguente viene illustrato come usare il metodo IDirect3DDevice9::SetTransform per impostare la matrice in corrispondenza del numero di stato di trasformazione 256 su una matrice di identità.
D3DMATRIX matBlend1;
D3DXMatrixIdentity( &matBlend1 );
m_pD3DDevice->SetTransform( D3DTS_WORLDMATRIX(0), &matBlend );
Per abilitare o disabilitare la fusione dei vertici indicizzati, impostare lo stato di rendering D3DRS_INDEXEDVERTEXBLENDENABLE su TRUE. Quando lo stato di rendering è abilitato, è necessario passare indici matrice come DWORD compressi con ogni vertice. Quando questo stato di rendering è disabilitato e la fusione dei vertici è abilitata, equivale ad avere gli indici matrice 0, 1, 2 e 3 in ogni vertice. L'esempio di codice seguente usa il metodo IDirect3DDevice9::SetRenderState per abilitare la fusione dei vertici indicizzati.
m_pD3DDevice->SetRenderState( D3DRS_INDEXEDVERTEXBLENDENABLE, TRUE );
Per abilitare o disabilitare la fusione dei vertici, impostare lo stato di rendering IDirect3DDevice9::SetRenderState su un valore diverso da D3DRS_DISABLE dal tipo enumerato D3DVERTEXBLENDFLAGS . Se questo stato di rendering non è impostato su D3DRS_DISABLE, è necessario passare il numero necessario di pesi per ogni vertice. L'esempio di codice seguente usa IDirect3DDevice9::SetRenderState per abilitare la fusione dei vertici con tre pesi per ogni vertice.
m_pD3DDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_3WEIGHTS );
Determinazione del supporto di blending dei vertici indicizzati
Per determinare le dimensioni massime per la matrice di fusione dei vertici indicizzati, controllare il membro MaxVertexBlendMatrixIndex della struttura D3DCAPS9 . L'esempio di codice seguente usa il metodo IDirect3DDevice9::GetDeviceCaps per recuperare questa dimensione.
D3DCAPS9 d3dCaps;
m_pD3DDevice->GetDeviceCaps( &d3dCaps );
IndexedMatrixMaxSize = d3dCaps.MaxVertexBlendMatrixIndex;
Se il valore impostato in MaxVertexBlendMatrixIndex è 0, il dispositivo non supporta matrici indicizzate.
Nota
Quando viene usata l'elaborazione dei vertici software, è possibile usare 256 matrici per la fusione dei vertici indicizzati, con o senza normale fusione.
Passaggio di indici matrice a Direct3D
Gli indici della matrice mondiale possono essere passati a Direct3D usando i vertex shader legacy - FVF - o dichiarazioni.
L'esempio di codice seguente illustra come usare i vertex shader legacy.
struct VERTEX
{
float x,y,z;
float weight;
DWORD matrixIndices;
float normal[3];
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZB2 | D3DFVF_LASTBETA_UBYTE4 |
D3DFVF_NORMAL);
Quando viene usato un vertex shader legacy, gli indici matrice vengono passati insieme alle posizioni dei vertici usando flag di D3DFVF_XYZBn. Gli indici matrice vengono passati come byte all'interno di una DWORD e devono essere presenti immediatamente dopo l'ultimo peso del vertice. I pesi dei vertici vengono passati anche usando D3DFVF_XYZBn. Una DWORD con pacchetto contiene index3, index2, index1 e index0, dove index0 si trova nel byte più basso di DWORD. Il numero di indici world-matrix usati è uguale al numero passato al numero di matrici usate come definito da D3DRS_VERTEXBLEND.
Quando viene usata una dichiarazione, D3DVSDE_BLENDINDICES definisce il registro dei vertici di input da cui ottenere indici matrice. Gli indici matrice devono essere passati come D3DVSDT_UBYTE4.
L'esempio di codice seguente illustra come usare dichiarazioni. Si noti che l'ordine dei componenti non è più importante a meno che non si usi uno shader a funzione fissa.
Ecco la dichiarazione del vertice.
struct VERTEX
{
float x,y,z;
float weight;
DWORD matrixIndices;
float normal[3];
}
Ecco la dichiarazione di registro corrispondente.
// 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()
};
Argomenti correlati