Partilhar via


Usando mesclagem de vértice indexada (Direct3D 9)

Os estados de transformação 256-511 são reservados para armazenar até 256 matrizes que podem ser indexadas usando índices de 8 bits. Use a macro D3DTS_WORLDMATRIX para mapear índices de 0 a 255 para os estados de transformação correspondentes. O exemplo de código a seguir mostra como usar o método IDirect3DDevice9::SetTransform para definir a matriz no estado de transformação número 256 para uma matriz de identidade.

D3DMATRIX matBlend1;
D3DXMatrixIdentity( &matBlend1 );
m_pD3DDevice->SetTransform( D3DTS_WORLDMATRIX(0), &matBlend );

Para habilitar ou desabilitar a mesclagem de vértice indexada, defina o estado de renderização D3DRS_INDEXEDVERTEXBLENDENABLE como TRUE. Quando o estado de renderização estiver habilitado, você deverá passar índices de matriz como DWORDs empacotados com cada vértice. Quando esse estado de renderização está desabilitado e a mesclagem de vértice está habilitada, é equivalente a ter os índices de matriz 0, 1, 2 e 3 em cada vértice. O exemplo de código abaixo usa o método IDirect3DDevice9::SetRenderState para habilitar a mesclagem de vértice indexado.

m_pD3DDevice->SetRenderState( D3DRS_INDEXEDVERTEXBLENDENABLE, TRUE );

Para habilitar ou desabilitar a mesclagem de vértice, defina o estado de renderização IDirect3DDevice9::SetRenderState como um valor diferente de D3DRS_DISABLE do tipo enumerado D3DVERTEXBLENDFLAGS . Se esse estado de renderização não estiver definido como D3DRS_DISABLE, você deverá passar o número necessário de pesos para cada vértice. O exemplo de código a seguir usa IDirect3DDevice9::SetRenderState para habilitar a mesclagem de vértice com três pesos para cada vértice.

m_pD3DDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_3WEIGHTS );

Determinando o suporte à mesclagem de vértice indexado

Para determinar o tamanho máximo da matriz de mesclagem de vértice indexada, marcar o membro MaxVertexBlendMatrixIndex da estrutura D3DCAPS9. O exemplo de código abaixo usa o método IDirect3DDevice9::GetDeviceCaps para recuperar esse tamanho.

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

Se o valor definido em MaxVertexBlendMatrixIndex for 0, o dispositivo não oferecerá suporte a matrizes indexadas.

Observação

Quando o processamento de vértice de software é usado, 256 matrizes podem ser usadas para mesclagem de vértice indexada, com ou sem mesclagem normal.

 

Passando índices de matriz para Direct3D

Os índices de matriz mundial podem ser passados para o Direct3D usando sombreadores de vértice herdados – FVF – ou declarações.

O exemplo de código abaixo mostra como usar sombreadores de vértice herdados.

struct VERTEX
{
    float x,y,z;
    float weight;
    DWORD matrixIndices;
    float normal[3];
};
    
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZB2 | D3DFVF_LASTBETA_UBYTE4 |
                             D3DFVF_NORMAL);

Quando um sombreador de vértice herdado é usado, os índices de matriz são passados junto com posições de vértice usando sinalizadores D3DFVF_XYZBn. Os índices de matriz são passados como bytes dentro de um DWORD e devem estar presentes imediatamente após o último peso do vértice. Pesos de vértice também são passados usando D3DFVF_XYZBn. Um DWORD empacotado contém index3, index2, index1 e index0, em que index0 está localizado no byte mais baixo do DWORD. O número de índices de matriz mundial usados é igual ao número passado para o número de matrizes usadas para mesclagem, conforme definido por D3DRS_VERTEXBLEND.

Quando uma declaração é usada, D3DVSDE_BLENDINDICES define o registro de vértice de entrada do qual obter índices de matriz. Os índices de matriz devem ser passados como D3DVSDT_UBYTE4.

O exemplo de código abaixo mostra como usar declarações. Observe que a ordem dos componentes não é mais importante, a menos que use um sombreador de vértice de função fixa.

Aqui está a declaração de vértice.

struct VERTEX
{
    float x,y,z;
    float weight;
    DWORD matrixIndices;
    float normal[3];
}

Aqui está a declaração de registro correspondente.

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

Mesclagem de vértice indexada