Geïndexeerd vertex blending gebruiken (Direct3D 9)
Transformatiestatussen 256-511 zijn gereserveerd voor het opslaan van maximaal 256 matrices die kunnen worden geïndexeerd met behulp van 8-bits indexen. Gebruik de macro D3DTS_WORLDMATRIX om indexen 0-255 toe te wijzen aan de bijbehorende transformatiestatussen. In het volgende codevoorbeeld ziet u hoe u de methode IDirect3DDevice9::SetTransform methode gebruikt om de matrix in te stellen op transformatiestatusnummer 256 op een identiteitsmatrix.
D3DMATRIX matBlend1;
D3DXMatrixIdentity( &matBlend1 );
m_pD3DDevice->SetTransform( D3DTS_WORLDMATRIX(0), &matBlend );
Om geïndexeerde vertex blend in of uit te schakelen, stelt u de render state D3DRS_INDEXEDVERTEXBLENDENABLE in op TRUE. Wanneer de renderstatus is ingeschakeld, moet u matrixindexen doorgeven als verpakte DWORDs met elk hoekpunt. Wanneer deze weergavestatus is uitgeschakeld en hoekpuntmixen is ingeschakeld, komt dit overeen met het hebben van de matrixindexen 0, 1, 2 en 3 in elk hoekpunt. In het onderstaande codevoorbeeld wordt de methode IDirect3DDevice9::SetRenderState gebruikt om geïndexeerde hoekpuntmixing mogelijk te maken.
m_pD3DDevice->SetRenderState( D3DRS_INDEXEDVERTEXBLENDENABLE, TRUE );
Als u vertex blending wilt in- of uitschakelen, stelt u de IDirect3DDevice9::SetRenderState render state in op een andere waarde dan D3DRS_DISABLE van het D3DVERTEXBLENDFLAGS geïnventariseerd type. Als deze weergavestatus niet is ingesteld op D3DRS_DISABLE, moet u het vereiste aantal gewichten voor elk hoekpunt doorgeven. In het volgende codevoorbeeld wordt gebruikgemaakt van IDirect3DDevice9::SetRenderState om hoekpuntmenging met drie wegingen per hoekpunt mogelijk te maken.
m_pD3DDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_3WEIGHTS );
Ondersteuning voor geïndexeerde vertex blending bepalen
Om de maximale grootte voor de geïndexeerde hoekpuntmixmatrix te bepalen, controleert u het onderdeel MaxVertexBlendMatrixIndex van de D3DCAPS9 structuur. In het onderstaande codevoorbeeld wordt de methode IDirect3DDevice9::GetDeviceCaps methode gebruikt om deze grootte op te halen.
D3DCAPS9 d3dCaps;
m_pD3DDevice->GetDeviceCaps( &d3dCaps );
IndexedMatrixMaxSize = d3dCaps.MaxVertexBlendMatrixIndex;
Als de waarde die is ingesteld in MaxVertexBlendMatrixIndex 0 is, biedt het apparaat geen ondersteuning voor geïndexeerde matrices.
Notitie
Wanneer software-vertexverwerking wordt gebruikt, kunnen 256 matrices worden gebruikt voor geïndexeerde vertexmenging, met of zonder normale menging.
Matrixindexen doorgeven aan Direct3D
Wereldmatrixindices kunnen worden doorgegeven aan Direct3D met behulp van verouderde vertex shaders (FVF) of declaraties.
In het onderstaande codevoorbeeld ziet u hoe u verouderde hoekpunt-shaders gebruikt.
struct VERTEX
{
float x,y,z;
float weight;
DWORD matrixIndices;
float normal[3];
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZB2 | D3DFVF_LASTBETA_UBYTE4 |
D3DFVF_NORMAL);
Wanneer een verouderde hoekpunt-shader wordt gebruikt, worden matrixindexen samen met hoekpuntposities doorgegeven met behulp van D3DFVF_XYZBn vlaggen. Matrixindexen worden doorgegeven als bytes in een DWORD en moeten direct na het laatste hoekpuntgewicht aanwezig zijn. Hoekpuntgewichten worden ook doorgegeven met behulp van D3DFVF_XYZBn. Een verpakte DWORD bevat index3, index2, index1 en index0, waarbij index0 zich in de laagste byte van het DWORD bevindt. Het aantal gebruikte wereldmatrixindexen is gelijk aan het aantal dat wordt doorgegeven aan het aantal matrices dat wordt gebruikt voor het mengen zoals gedefinieerd door D3DRS_VERTEXBLEND.
Wanneer een declaratie wordt gebruikt, definieert D3DVSDE_BLENDINDICES het invoerpuntregister om matrixindexen op te halen. Matrixindexen moeten worden doorgegeven als D3DVSDT_UBYTE4.
In het onderstaande codevoorbeeld ziet u hoe u declaraties gebruikt. Houd er rekening mee dat de volgorde van de onderdelen niet meer belangrijk is, tenzij u een vertex-shader met een vaste functie gebruikt.
Hier volgt de vertexdeclaratie.
struct VERTEX
{
float x,y,z;
float weight;
DWORD matrixIndices;
float normal[3];
}
Hier volgt de bijbehorende registerdeclaratie.
// 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()
};
Verwante onderwerpen