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. 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()
};

Fusione dei vertici indicizzati