Freigeben über


Verwenden der indizierten Vertexmischung (Direct3D 9)

Transformationszustände 256-511 sind reserviert, um bis zu 256 Matrizen zu speichern, die mithilfe von 8-Bit-Indizes indiziert werden können. Verwenden Sie das Makro D3DTS_WORLDMATRIX , um die Indizes 0 bis 255 den entsprechenden Transformationszuständen zuzuordnen. Das folgende Codebeispiel zeigt, wie Sie die IDirect3DDevice9::SetTransform-Methode verwenden, um die Matrix auf transformierte Zustandszahl 256 auf eine Identitätsmatrix festzulegen.

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

Legen Sie zum Aktivieren oder Deaktivieren der indizierten Vertexmischung den D3DRS_INDEXEDVERTEXBLENDENABLE Renderzustand auf TRUE fest. Wenn der Renderzustand aktiviert ist, müssen Sie Matrixindizes als gepackte DWORDs mit jedem Scheitelpunkt übergeben. Wenn dieser Renderzustand deaktiviert ist und die Vertexmischung aktiviert ist, entspricht dies dem Vorhandensein der Matrixindizes 0, 1, 2 und 3 in jedem Scheitelpunkt. Im folgenden Codebeispiel wird die IDirect3DDevice9::SetRenderState-Methode verwendet, um die indizierte Vertexmischung zu aktivieren.

m_pD3DDevice->SetRenderState( D3DRS_INDEXEDVERTEXBLENDENABLE, TRUE );

Um die Vertexmischung zu aktivieren oder zu deaktivieren, legen Sie den IDirect3DDevice9::SetRenderState-Renderzustand auf einen anderen Wert als D3DRS_DISABLE des aufgezählten D3DVERTEXBLENDFLAGS-Typs fest. Wenn dieser Renderzustand nicht auf D3DRS_DISABLE festgelegt ist, müssen Sie die erforderliche Anzahl von Gewichtungen für jeden Scheitelpunkt übergeben. Im folgenden Codebeispiel wird IDirect3DDevice9::SetRenderState verwendet, um die Vertexmischung mit drei Gewichtungen für jeden Scheitelpunkt zu aktivieren.

m_pD3DDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_3WEIGHTS );

Ermitteln der Unterstützung für die Indizierung von Vertex-Blending

Um die maximale Größe für die indizierte Vertex-Blendingmatrix zu bestimmen, überprüfen Sie das MaxVertexBlendMatrixIndex-Element der D3DCAPS9-Struktur . Im folgenden Codebeispiel wird die IDirect3DDevice9::GetDeviceCaps-Methode verwendet, um diese Größe abzurufen.

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

Wenn der in MaxVertexBlendMatrixIndex festgelegte Wert 0 ist, unterstützt das Gerät keine indizierten Matrizen.

Hinweis

Bei Verwendung der Softwarevertexverarbeitung können 256 Matrizen für die indizierte Vertexmischung mit oder ohne normales Mischen verwendet werden.

 

Übergeben von Matrixindizes an Direct3D

Weltmatrixindizes können mithilfe von Legacy-Vertex-Shadern (FVF) oder Deklarationen an Direct3D übergeben werden.

Das folgende Codebeispiel zeigt, wie Legacy-Vertex-Shader verwendet werden.

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

Wenn ein Legacy-Vertex-Shader verwendet wird, werden Matrixindizes zusammen mit Vertexpositionen mit D3DFVF_XYZBn Flags übergeben. Matrixindizes werden als Bytes innerhalb eines DWORD übergeben und müssen unmittelbar nach der letzten Vertexgewichtung vorhanden sein. Vertexgewichtungen werden auch mit D3DFVF_XYZBn übergeben. Ein gepacktes DWORD enthält index3, index2, index1 und index0, wobei index0 sich im niedrigsten Byte des DWORD befindet. Die Anzahl der verwendeten Weltmatrixindizes entspricht der Zahl, die an die Anzahl der Matrizen übergeben wird, die für die Mischung verwendet werden, wie durch D3DRS_VERTEXBLEND definiert.

Wenn eine Deklaration verwendet wird, definiert D3DVSDE_BLENDINDICES das Eingabevertexregister, aus dem Matrixindizes abgerufen werden sollen. Matrixindizes müssen als D3DVSDT_UBYTE4 übergeben werden.

Das folgende Codebeispiel zeigt, wie Deklarationen verwendet werden. Beachten Sie, dass die Reihenfolge der Komponenten nicht mehr wichtig ist, es sei denn, es wird ein Vertex-Shader mit fester Funktion verwendet.

Hier ist die Vertexdeklaration.

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

Hier ist die entsprechende Registerdeklaration.

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

Indizierte Vertex-Blending