共用方式為


使用幾何混合 (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 轉譯方法轉譯的所有物件執行幾何混合。

另請參閱

固定函式 FVF 程式碼 (Direct3D 9)

幾何混合