共用方式為


幾何混合 (Direct3D 9)

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_WORLDD3DTS_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 版本中只能使用三個。

 

下列主題包含其他資訊。

頂點管線