共用方式為


D3DX 中的網格支援 (Direct3D 9)

D3DX 是提供協助程式服務的公用程式連結庫。 它是 Direct3D 元件上方的圖層。

網 格

D3DX 會實作網格建構,以載入、操作和轉譯 .x 檔案內容。 網格基本上是定義一些幾何的頂點集合,以及一組定義臉部的索引。 有數種網格類型。

ID3DXBaseMesh 提供基本概念。 ID3DXMesh 繼承自 ID3DXBaseMesh ,並使用每個晶片頂點快取新增網格優化。 ID3DXSkinInfo 提供外觀網格支援。

ID3DXBaseMesh 提供方法來操作及查詢繼承自基底網格的ID3DXMesh網格物件。 這包括相鄰作業、幾何緩衝區擷取、鎖定/解除鎖定作業(頂點和索引),以及複製、轉譯、臉部和頂點資訊。

注意

已卸除舊版 Direct3D 9 中提供的 ID3DXPMesh 和 ID3DXSPMesh 介面(分別支援漸進式和簡化的網格)。

 

網格架構

網格包含複雜模型的數據。 它是抽象數據容器,其中包含紋理和材質等資源,以及位置數據和相鄰數據等屬性。 有數個網格作業可改善繪圖效能和表面的外觀。 此外,還有一些其他網格概念會影響網格作業的功能。 了解這些網格概念,以便套用它們可改善網格效能。

Mesh 對象數據

網格包含頂點緩衝區、索引緩衝區和屬性緩衝區。

  • 頂點緩衝區包含頂點數據,也就是網格頂點。
  • 索引緩衝區包含用來存取頂點緩衝區的頂點索引。 這可藉由減少重複的頂點來減少頂點緩衝區大小。 只有索引網狀結構會使用索引緩衝區。 例如,如果網格是由三角形清單所組成,則不會使用索引緩衝區。
  • 屬性緩衝區包含屬性數據。 屬性是網格頂點的屬性,沒有特定順序。 D3DX 網格會將屬性儲存在每個臉部的 DWORDS 群組中。

屬性數據表

屬性數據表是屬性緩衝區內容的精簡表示法。 藉由呼叫其中一個具有D3DXMESHOPT_ATTRSORT的 Optimize 方法、鎖定屬性緩衝區並填入數據,或呼叫 SetAttributeTable,即可建立屬性數據表。 當網格重新排序為群組時,網格會包含屬性表。 呼叫 Optimize 時,假設提供屬性排序選項(D3DXMESHOPT_ATTRSORT或更高版本),就會發生這種情況。 D3DX Meshes 使用索引的三角形清單,因此會使用 IDirect3DDevice9::D rawIndexedPrimitive 繪製。

屬性數據表會建立為呼叫 Optimize 的結果。 臉部不需要相鄰,因為Optimize會將它們重新排序為相鄰。 例如,人類網格的手可以使用相同的屬性。 標識元有助於將臉部排序成群組。 來自 .x 檔案的網格會自動產生材質和紋理屬性的屬性。 您確實需要呼叫 Optimize(ATTRSORT)或更有效的 Optimize(VERTEXCACHE),以取得良好的效能。 載入函式會嘗試以儲存到的確切格式呈現數據。 如果您使用頂點緩衝區/索引緩衝區型網格,網格 API 會提供優化函式和外觀轉換,而不需要額外負荷。

優化類型是累積的,從最不理想的 (D3DXMESHOPT_COMPACT) 到最理想的 (D3DXMESHOPT_IGNOREVERTS)。 D3DXMESHOPT_STRIPREORDER會執行壓縮和屬性排序。 D3DXMESHOPT_VERTEXCACHE一律建議使用,即使在沒有真實頂點快取的裝置上也一樣。

應用程式資料

應用程式數據是由應用程式管理的網格數據。 網格頂點數據與這些緩衝區所管理的數據之間有緊密結合。

材質緩衝區包含 n 個材質。 載入 .x 檔案時,Load 函式會傳回材質。 每個子集都可以有自己的材質和紋理。 材質緩衝區是靜態的。

相鄰緩衝區包含邊緣、臉部和相鄰臉部的相關信息。 某些網格作業取決於知道彼此相鄰的臉部。 這項稱為相鄰數據的資訊會保留在相鄰緩衝區中。 它不是網格的一部分,而是由應用程式維護,而且必須在必要時提供給網格方法。

效果實例緩衝區包含效果實例的清單。 效果實例會儲存狀態。 此狀態資訊可用來初始化管線。 效果實例包含效果中的名稱/值組。

進階網格主題

優化網格建置在基底網格功能上,並使用兩種方法新增頂點快取優化功能:Optimize,這會建立新的網格,以及修改原始網格的 OptimizeInPlace。

D3DXGeneratePMesh 會使用 D3DX 簡化演算法,從輸入網格產生漸進式網格。 D3DXSimplifyMesh 會使用相同的簡化演算法,從輸入網格產生指定詳細層級的標準網格。 用戶可控制透過每個頂點指定的權數和每個頂點所指定權數所使用的錯誤計量。 每個元件權數會與每個邊緣折疊計算之錯誤的元件部分相乘。 每個頂點權數會與決定移除該頂點的錯誤計量值相乘。 例如,如果您從未想要移除頂點,請將該特定頂點的權數設定為大值。 相反地,如果您想要稍早移除,請將它設定為較小的值(小於 1)。

ID3DXSkinInfo 支援瘦身字元。 皮膚字元是由一組網格和一組影響網格頂點的骨骼所定義。 骨頭會以轉換階層表示。 對於每個網格,每個骨頭都有一個矩陣會影響它,它會將網格轉換成骨頭的本機座標空間。 這個矩陣是網格骨的骨頭空間轉換。 這是在撰寫程式中,基本架構與網格相關聯時所定義。

剝皮

皮膚化是一種使用骨骼來轉換網格頂點的技術。 骨骼通常排列在階層式骨骼中,就像人體中的骨骼一樣。 然後,對象頂點會與骨骼相關聯,例如將皮膚附加至骨骼。 當骨頭被轉換時,皮膚也會改變。

皮膚網格使用骨骼來影響一些頂點。 骨頭轉換數據是由使用者提供,以影響如何 SRT 骨頭。 網格會使用轉換的骨骼來影響與骨骼相關聯的頂點。 調色盤是SRT轉換的陣列。 調色盤通常實作為矩陣,但可以包含 SRT 值。

漸進式網格修剪

低細節區域可能會失去不會變更表面呈現外觀的頂點。 這是特別真實的對象,因為它們從相機更遠的地方移動。 這稱為詳細層級。 使用者具有 API 層級的轉譯控件,可設定詳細數據層級,以最大化轉譯效率。

漸進式網格物件會以大量臉部開頭,並使用簡化來減少臉部數目。 檢視獨立的漸進式網格稱為檢視獨立漸進式網格(VIPM)。

減少臉部數目的另一種方式是修剪。 這實際上會從網格中移除頂點和臉部。 修剪可以在高端完成(以限制臉部數目上限)或低端(限制臉部數目下限)。不過,修剪可改善繪製效能,但應該使用護理來保留視覺品質。 修剪示範於漸進式網格 SDK 範例中。

對於高可見度區域,您可以使用漸進式詳細數據層級來增加解析度(PLOD)。 這是將單一臉部分成兩個臉部的技術。

修補網格

也支援兩種特殊類型的修補網格:矩形和三角形修補程式。 矩形修補網狀結構是一個修補網格,其控制點會以纏繞矩形序列配置。 矩形和三角形修補程式可用來建立高階表面。 它們不如三角形網格般使用。

D3DX