使用索引頂點混合 (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()
};
相關主題