使用幾何混合 (Direct3D 9)
下列使用者定義的結構可用於兩個矩陣之間混合的頂點。
// The flexible vertex format (FVF) descriptor for this vertex would be:
// FVF = D3DFVF_XYZB1 | D3DFVF_NORMAL | D3DFVF_TEX1;
struct D3DBLENDVERTEX {
D3DVECTOR v;
FLOAT blend;
D3DVECTOR n;
FLOAT tu, tv;
};
混合粗細必須出現在 FVF 中的位置和 RHW 資料之後,以及頂點常態之前。
請注意,上述頂點格式只包含一個混合加權值。 這是因為有兩個世界矩陣,定義在 D3DTS_WORLDMATRIX (0) 和 D3DTS_WORLDMATRIX (1 個) 轉換狀態中。 系統會使用單一加權值,在這兩個矩陣之間混合每個頂點。 針對三個矩陣,只需要兩個權數,依此類傳。
注意
定義面板權數很簡單。 使用連接之間距離的線性函式是不錯的起點,但較平滑的 sigmoid 函式看起來更好。 如果想要的話,選擇面板權數分佈函式可能會導致聯合的尖,方法是在短距離內使用大變化的面板重量。
設定混合矩陣
您可以藉由呼叫 IDirect3DDevice9::SetTransform 方法來設定系統混合的轉換矩陣。 將第一個參數設定為 D3DTS_WORLDMATRIX 宏所定義的值,並將第二個參數設定為要設定的矩陣位址。
下列 C++ 程式碼範例會設定兩個世界矩陣,在其中混合幾何以建立聯合 Arm 的假像。
// For this example, the d3dDevice variable is assumed to be a valid pointer
// to an IDirect3DDevice9 interface for an initialized 3D scene.
float BendAngle = 3.1415926f / 4.0f; // 45 degrees
D3DMATRIX matUpperArm, matLowerArm;
// The upper arm is immobile. Use the identity matrix.
D3DXMatrixIdentity( matUpperArm );
d3dDevice->SetTransform( D3DTS_WORLDMATRIX(0), &matUpperArm );
// The lower arm rotates about the x-axis, attached to the upper arm.
D3DXMatrixRotationX( matLowerArm, -BendAngle );
d3dDevice->SetTransform( D3DTS_WORLDMATRIX(1), &matLowerArm );
設定混合矩陣只會讓系統快取矩陣以供稍後使用;它不會指示系統開始混合頂點。
啟用幾何混合
預設會停用幾何混合。 若要啟用幾何混合,請呼叫 IDirect3DDevice9::SetRenderState 方法,將D3DRS_VERTEXBLEND轉譯狀態設定為 來自 D3DVERTEXBLENDFLAGS 列舉類型的值。 下列程式碼範例顯示當設定兩個世界矩陣之間混合的轉譯狀態時,此呼叫看起來可能的樣子。
d3dDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_1WEIGHTS );
當D3DRS_VERTEXBLEND設定為D3DVBF_DISABLE以外的任何值時,系統會假設頂點格式會包含適當的混合權數。 您必須負責提供相容的頂點格式,並將該格式的適當描述提供給 Direct3D 轉譯方法。
啟用時,系統會針對 DrawPrimitive 轉譯方法轉譯的所有物件執行幾何混合。
另請參閱
相關主題