共用方式為


使用幾何混合(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++ 代碼範例設定了兩個世界矩陣,通過在它們之間進行幾何混合來創造出關節手臂的錯覺。

// 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)

幾何混合