Direct3D 可讓應用程式透過轉譯分段的多邊形物件,特別是具有順暢關節的角色,來提升場景的真實感。 這些效果通常稱為蒙皮。 系統會將額外的世界轉換矩陣套用至單一頂點集來建立多個結果,然後執行結果頂點之間的線性混合,以建立一組用於轉譯的單一幾何,以達到這個效果。 下圖的插圖以香蕉顯示此過程。
上圖顯示您如何可以想像幾何混合過程。 在單次渲染呼叫中,系統會接收香蕉的頂點,並進行兩次轉換——一次不作修改,另一次進行簡單的旋轉——然後混合結果以創造出彎曲的香蕉。 系統會在啟用光源時混合頂點位置,以及頂點正常。 應用程式不限於兩個混合路徑;Direct3D 可以在多達四個世界矩陣之間混合幾何,包括標準世界矩陣,D3DTS_WORLD。
注意
啟用光源時,頂點常態會由對應的反向世界檢視矩陣轉換,其加權方式與頂點位置計算相同。 如果D3DRS_NORMALIZENORMALS轉譯狀態設定為 TRUE,系統會將產生的一般向量正規化。
若沒有幾何混合,動態的關節模型通常會以片段形式渲染。 例如,請考慮人類手臂的 3D 模型。 在最簡單的檢視中,手臂有兩個部分:連接到身體的上臂,以及連接到手部的下臂。 兩者連接在肘部,下臂在該點旋轉。 轉譯手臂的應用程式可能會保留上臂和下臂的頂點數據,每個都有個別的世界轉換矩陣。 下列程式代碼範例說明這點。
typedef struct _Arm
{
VERTEX upper_arm_verts[200];
D3DMATRIX matWorld_Upper;
VERTEX lower_arm_verts[200];
D3DMATRIX matWorld_Lower;
} ARM, *LPARM;
ARM MyArm; // This needs to be initialized.
若要轉譯arm,會進行兩個轉譯呼叫,如下列程式代碼所示。
// Render the upper arm.
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Upper );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );
// Render the lower arm, updating its world matrix to articulate
// the arm by pi/4 radians (45 degrees) at the elbow.
MyArm.matWorld_Lower = RotateMyArm(MyArm.matWorld, pi/4);
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Lower );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );
下圖是香蕉,已修改為使用這項技術。
插圖顯示一個經過混合但不含幾何混合的香蕉 
混合幾何與非漂白幾何之間的差異是顯而易見的。 這個範例有點極端。 在現實世界中的應用中,分段模型的接合處設計為讓接縫不那麼明顯。 不過,接縫有時可見,這對模型設計師帶來了持續的挑戰。
Direct3D 中的幾何混合提供傳統區段模型化案例的替代方案。 不過,分割物件的可視化品質改善是以渲染期間的混合計算為代價的。 為了將這些額外作業的影響降到最低,Direct3D 幾何管線經過優化,以便在盡量減少額外負擔的情況下整合幾何。 以智慧方式使用 Direct3D 所提供的幾何混合服務的應用程式可以提升其角色的逼真度,同時避免嚴重的效能影響。
混合轉換與渲染狀態
IDirect3DDevice9::SetTransform 方法可辨識 D3DTS_WORLD 和 D3DTS_WORLDn 巨集,這些巨集對應至 D3DTS_WORLDMATRIX 巨集可定義的值。 這些巨集用來識別幾何圖形之間要混合的矩陣。
D3DRENDERSTATETYPE 列舉型別,包含D3DRS_VERTEXBLEND渲染狀態,用於啟用和控制幾何混合。 這個轉譯狀態的有效值是由 D3DVERTEXBLENDFLAGS 列舉型別所定義。 如果已啟用幾何混合,頂點格式必須包含適當的混合權數。
混合權重
混合權數,有時稱為 Beta 權數,控制指定世界矩陣影響頂點的程度。 混合權數是浮點值,範圍從0.0到1.0,並以頂點格式編碼,其中0.0值表示頂點不會與該矩陣混合,1.0表示頂點會完全受到矩陣的影響。
幾何混合權重會以頂點格式編碼,並緊接在每個頂點的位置後面出現,如 固定函數 FVF 代碼(Direct3D 9)中所述。 您可以在您提供給轉譯方法的頂點描述中包含其中一個 FVF 常 數,以頂點格式傳達混合權數的數目。
系統會在加權混合矩陣的結果之間進行線性混合。 下列方程式是完整的混合公式。
使用世界轉換矩陣的線性混合方程式 
在上述方程式中,vBlend 是輸出頂點,v 元素是套用世界矩陣所產生的頂點(D3DTS_WORLDn)。 W 元素是頂點格式內的對應權數值。 在 n 矩陣之間混合的頂點可以有 - 1 個混合權數值,每個混合矩陣各有一個,但最後一個除外。 系統會自動生成最後一個世界矩陣的權重,使所有權重的總和為 1.0,並用 sigma 表示法來表示。 您可以針對 Direct3D 所支援的每個案例簡化此公式,如下列方程式所示。
三種混合情況的線性混合方程 
這些是兩個、三個和四個混合矩陣案例之完整混合公式的簡化形式。
注意
雖然 Direct3D 包含 FVF 描述元來定義最多包含五個混合權數的頂點,但在此 DirectX 版本中只能使用三個。
下列主題包含其他資訊。
相關主題