Condividi tramite


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. Utilizzare la macro D3DTS_WORLDMATRIX per eseguire il mapping degli indici da 0 a 255 agli stati di trasformazione corrispondenti. L'esempio di codice seguente illustra come usare il metodo IDirect3DDevice9::SetTransform per impostare la matrice in corrispondenza del numero di stato di trasformazione 256 su una matrice identity.

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 di matrice come DWORD impacchettati con ogni vertice. Quando questo stato di rendering è disabilitato e la fusione dei vertici è abilitata, equivale ad avere gli indici della 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 il IDirect3DDevice9::SetRenderState stato di rendering 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 di pesi richiesto 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 per la fusione dei vertici indicizzati

Per determinare le dimensioni massime della matrice di fusione dei vertici indicizzati, è necessario controllare il membro MaxVertexBlendMatrixIndex della struttura D3DCAPS9. L'esempio di codice seguente usa il metodo IDirect3DDevice9::GetDeviceCaps per recuperare queste dimensioni.

D3DCAPS9 d3dCaps;
    
m_pD3DDevice->GetDeviceCaps( &d3dCaps );
IndexedMatrixMaxSize = d3dCaps.MaxVertexBlendMatrixIndex;

Se il valore impostato in MaxVertexBlendMatrixIndex è 0, il dispositivo non supporta matrici indicizzate.

Nota

Quando si utilizza l'elaborazione dei vertici software, è possibile utilizzare 256 matrici per la fusione dei vertici indicizzati, con o senza fusione normale.

 

Passaggio di indici di matrice a Direct3D

Gli indici della matrice globale possono essere passati a Direct3D usando vertex shader legacy - FVF - o dichiarazioni.

L'esempio di codice seguente illustra come usare 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 si usa un vertex shader legacy, gli indici di matrice vengono passati insieme alle posizioni dei vertici usando D3DFVF_XYZBn flag. Gli indici di matrice vengono passati come byte all'interno di una DWORD e devono essere presenti immediatamente dopo l'ultimo peso del vertice. Anche i pesi dei vertici vengono passati usando D3DFVF_XYZBn. Un DWORD compresso contiene index3, index2, index1 e index0, dove index0 si trova nel byte più basso del DWORD. Il numero di indici della matrice globale utilizzati è uguale al numero passato al numero di matrici utilizzate per la fusione, come definito da D3DRS_VERTEXBLEND.

Quando viene usata una dichiarazione, D3DVSDE_BLENDINDICES definisce il registro dei vertici di input da cui ottenere gli indici della matrice. Gli indici di matrice devono essere passati come D3DVSDT_UBYTE4.

L'esempio di codice seguente illustra come usare le dichiarazioni. Si noti che l'ordine dei componenti non è più importante a meno che non si usi un vertex 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()
};

Fusione di Vertici Indicizzati