Compartir a través de


Usar mezcla de vértices indizado (Direct3D 9)

Los estados de transformación 256-511 se reservan para almacenar hasta 256 matrices que se pueden indexar mediante índices de 8 bits. Use la macro D3DTS_WORLDMATRIX para asignar índices 0-255 a los estados de transformación correspondientes. En el ejemplo de código siguiente se muestra cómo usar el método IDirect3DDevice9::SetTransform para establecer la matriz en el número de estado de transformación 256 en una matriz de identidad.

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

Para habilitar o deshabilitar la mezcla de vértices indizados, establezca el estado de representación D3DRS_INDEXEDVERTEXBLENDENABLE en TRUE. Cuando el estado de representación está habilitado, debe pasar índices de matriz como DWORD empaquetados con cada vértice. Cuando este estado de representación está deshabilitado y la mezcla de vértices está habilitada, equivale a tener los índices de matriz 0, 1, 2 y 3 en cada vértice. En el ejemplo de código siguiente se usa el método IDirect3DDevice9::SetRenderState para habilitar la mezcla de vértices indizado.

m_pD3DDevice->SetRenderState( D3DRS_INDEXEDVERTEXBLENDENABLE, TRUE );

Para habilitar o deshabilitar la mezcla de vértices, establezca el estado de representación IDirect3DDevice9::SetRenderState en un valor distinto de D3DRS_DISABLE del tipo enumerado D3DVERTEXBLEBLENDFLAGS . Si este estado de representación no está establecido en D3DRS_DISABLE, debe pasar el número necesario de pesos para cada vértice. En el ejemplo de código siguiente se usa IDirect3DDevice9::SetRenderState para habilitar la mezcla de vértices con tres pesos para cada vértice.

m_pD3DDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_3WEIGHTS );

Determinar la compatibilidad con mezcla de vértices indizado

Para determinar el tamaño máximo de la matriz de mezcla de vértices indizado, compruebe el miembro MaxVertexBlendMatrixIndex de la estructura D3DCAPS9 . En el ejemplo de código siguiente se usa el método IDirect3DDevice9::GetDeviceCaps para recuperar este tamaño.

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

Si el valor establecido en MaxVertexBlendMatrixIndex es 0, el dispositivo no admite matrices indexadas.

Nota

Cuando se usa el procesamiento de vértices de software, se pueden usar 256 matrices para la mezcla de vértices indizada, con o sin mezcla normal.

 

Pasar índices de matriz a Direct3D

Los índices de matriz mundial se pueden pasar a Direct3D mediante sombreadores de vértices heredados : FVF o declaraciones.

En el ejemplo de código siguiente se muestra cómo usar sombreadores de vértices heredados.

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

Cuando se usa un sombreador de vértices heredado, los índices de matriz se pasan junto con las posiciones de vértice mediante marcas de D3DFVF_XYZBn. Los índices de matriz se pasan como bytes dentro de un DWORD y deben estar presentes inmediatamente después del último peso del vértice. Los pesos de vértice también se pasan mediante D3DFVF_XYZBn. Un DWORD empaquetado contiene index3, index2, index1 e index0, donde index0 se encuentra en el byte más bajo de DWORD. El número de índices de matriz mundial usados es igual al número que se pasa al número de matrices usadas para combinar según se define en D3DRS_VERTEXBLEND.

Cuando se usa una declaración, D3DVSDE_BLENDINDICES define el registro de vértices de entrada para obtener índices de matriz. Los índices de matriz se deben pasar como D3DVSDT_UBYTE4.

En el ejemplo de código siguiente se muestra cómo usar declaraciones. Tenga en cuenta que el orden de los componentes ya no es importante a menos que use un sombreador de vértices de función fija.

Esta es la declaración de vértice.

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

Esta es la declaración de registro correspondiente.

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

Fusión de vértices indizado