使用索引頂點混合 (Direct3D 9)

轉換狀態 256-511 會保留,以儲存最多 256 個可使用 8 位索引編制索引的矩陣。 使用宏 D3DTS_WORLDMATRIX 將索引 0-255 對應至對應的轉換狀態。 下列程式碼範例示範如何使用 IDirect3DDevice9::SetTransform 方法,將轉換狀態號碼 256 的矩陣設定為識別矩陣。

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

若要啟用或停用已編制索引的頂點混合,請將D3DRS_INDEXEDVERTEXBLENDENABLE轉譯狀態設定為 TRUE。 啟用轉譯狀態時,您必須將矩陣索引當做封裝的 DWORD 與每個頂點傳遞。 當停用此轉譯狀態並啟用頂點混合時,相當於在每個頂點中擁有矩陣索引 0、1、2 和 3。 下列程式碼範例會使用 IDirect3DDevice9::SetRenderState 方法來啟用已編制索引的頂點混合。

m_pD3DDevice->SetRenderState( D3DRS_INDEXEDVERTEXBLENDENABLE, TRUE );

若要啟用或停用頂點混合,請將 IDirect3DDevice9::SetRenderState 轉譯狀態設定為 從 D3DVERTEXBLENDFLAGS 列舉類型D3DRS_DISABLE以外的值。 如果此轉譯狀態未設定為 D3DRS_DISABLE,則您必須傳遞每個頂點所需的權數。 下列程式碼範例會使用 IDirect3DDevice9::SetRenderState 來啟用每個頂點的三個加權混合頂點。

m_pD3DDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_3WEIGHTS );

判斷索引頂點混合支援

若要判斷索引頂點混合矩陣的大小上限,請檢查 D3DCAPS9 結構的 MaxVertexBlendMatrixIndex 成員。 下列程式碼範例會使用 IDirect3DDevice9::GetDeviceCaps 方法來擷取此大小。

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

如果 MaxVertexBlendMatrixIndex 中設定的值是 0,則裝置不支援已編制索引的矩陣。

注意

使用軟體頂點處理時,256 個矩陣可用於編制索引的頂點混合,而不需要一般混合。

 

將矩陣索引傳遞至 Direct3D

您可以使用舊版頂點著色器 - FVF - 或宣告,將世界矩陣索引傳遞至 Direct3D。

下列程式碼範例示範如何使用舊版頂點著色器。

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

使用舊版頂點著色器時,矩陣索引會與使用D3DFVF_XYZBn旗標的頂點位置一起傳遞。 矩陣索引會在 DWORD 內以位元組的形式傳遞,而且必須緊接在最後一個頂點加權之後。 頂點權數也會使用D3DFVF_XYZBn傳遞。 已封裝的 DWORD 包含 index3、index2、index1 和 index0,其中 index0 位於 DWORD 的最低位元組中。 使用世界矩陣索引的數目等於傳遞至用於混合的矩陣數目,如 D3DRS_VERTEXBLEND所定義。

使用宣告時,D3DVSDE_BLENDINDICES定義輸入頂點暫存器,以從中取得矩陣索引。 矩陣索引必須傳遞為D3DVSDT_UBYTE4。

下列程式碼範例示範如何使用宣告。 請注意,除非使用固定函式頂點著色器,否則元件的順序不再重要。

以下是頂點宣告。

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

以下是對應的暫存器宣告。

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

索引頂點混合