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()
};
Tópicos relacionados