共用方式為


計劃從 OpenGL ES 2.0 移植到 Direct3D

重要 API

如果你從 iOS 或 Android 平台移植遊戲,你很可能已經在 OpenGL ES 2.0 上投入大筆資金。 準備將圖形流程程式碼庫移至 Direct3D 11 和 Windows 執行階段時,您應該先考慮一些事項。

大多數移植工作通常涉及最初步行程式碼庫和在兩個模型之間對映通用的 API 和模式。 如果您需要一些時間來閱讀和評論本主題,會發現該過程簡單一些。

將圖形從 OpenGL ES 2.0 移植到 Direct3D 11 時,請備註以下幾點。

特定 OpenGL ES 2.0 提供者的備註事項

本節中的移植主題參考 Khronos Group 建立的 OpenGL ES 2.0 規範的 Windows 實現。 所有的 OpenGL ES 2.0 程式碼樣本都是使用 Visual Studio 2012 和基本的 Windows C 語法開發的。 如果您來自 Objective-C (iOS) 或 Java (Android) 程式碼庫,請備註提供的 OpenGL ES 2.0 程式碼範例可能不會使用類似的 API 呼叫語法或參數。 本指南儘量不考慮平台因素。

本文件僅使用 2.0 規範 API 作為 OpenGL ES 程式碼和參考。 如果您是從 OpenGL ES 1.1 或 3.0 移植,雖然某些 OpenGL ES 2.0 程式碼範例和內容可能不熟悉,但此內容仍可證明是有用的。

這些主題中的 Direct3D 11 範例使用 Microsoft Windows C++ with Component Extensions (CX)。 如需此版本 C++ 語法的詳細資訊,請閱讀 Visual C++、Component Extensions for Runtime Platforms,以及 Quick Reference (C++\CX)。

瞭解您的硬體需求與資源

OpenGL ES 2.0 支援的一組圖形處理功能大致對應至 Direct3D 9.1 所提供的功能。 如果您想利用 Direct3D 11 中提供的更高級的功能,請在規劃埠時檢視 Direct3D 11,或在完成初始工作後檢視 DirectX 9 到 Universal Windows Platform (UWP) 的連接埠主題。

若要簡化初始移轉工作,請從 Visual Studio Direct3D 範本開始。 它提供已為您設定的基本轉譯器,並支援 UWP 應用程式功能,例如視窗變更和 Direct3D 功能等級上重新建立資源。

瞭解 Direct3D 功能等級

Direct3D 11 提供從 9_1 (Direct3D 9.1) 到 11_1 的硬體功能等級支援。 這些功能等級表示某些圖形功能與資源的可用性。 通常,大多數 OpenGL ES 2.0 平台都支援 Direct3D 9.1 (功能級別 9_1) 功能集。

檢閱 DirectX 圖形功能和 API

API 系列 描述
DXGI DirectX Graphics Infrastructure (DXGI) 提供圖形硬體與 Direct3D 之間的介面。 它使用 IDXGI Adapter 和 IDXGI Device1 COM 介面設定裝置介面卡和硬體配置。 使用它來建立和設定緩衝區和其他視窗資源。 特別地,IDXGI Factory 2 工廠模式用於獲取圖形資源,包括交換鏈 (一組幀緩衝區)。 由於 DXGI 擁有交換鏈,所以 IDXGI SwapChain 介面用於將幀顯示到螢幕上。
Direct3D Direct3D 是一組 API,提供圖形介面的虛擬表示,並允許您使用它繪製圖形。 版本 11 在功能上與 OpenGL 4.3 大致相當。 (另一方面,OpenGL ES 2.0 類似於 DirectX 9、Feature-wise 和 OpenGL 2.0,但使用 OpenGL 3.0 的統一著色器流程。) 大多數繁重的工作都是透過 ID3D11Device1 和 ID3D11DeviceContext1 介面完成的,這兩個介面分別提供對單個資源和子資源的存取以及渲染背景內容。
Direct2D Direct2D 提供一組用於 GPU 加速的 2D 渲染的 API。 它可以被認為與 OpenVG 類似。
DirectWrite DirectWrite 提供一組 API,用於 GPU 加速的高品質字型渲染。
DirectXMath DirectX Math 提供一組 API 和巨集,用於處理常見的線性代數和三角型別、值和函式。 這些型別和函式設計用於與 Direct3D 及其著色器操作配合使用。
DirectX HLSL Direct3D 著色器使用的目前 HLSL 語法。 實現 Direct3D Shader Model 5.0。

 

檢閱 Windows 執行階段 API 和範本程式庫

Windows 執行階段 API 為 UWP 應用程式提供整體基礎結構。 在這裡檢閱。

移轉圖形流程時所使用的主要 Windows 執行階段 API 包括:

此外,Windows 執行階段 C++ 範本程式庫 (WRL) 是一個範本程式庫,可提供低階方式來編寫和使用 Windows 執行階段元件。 UWP 應用程式的 Direct3D 11 API 最好搭配此程式庫中的介面與型別,例如智慧指標 (ComPtr)。 如需有關 WRL 的詳細資訊,請閱讀 Windows Runtime C++ Template Library (WRL)。

變更座標系

一個有時混淆早期埠工作的不同是從 OpenGL 的傳統右手座標系到 Direct3D 的預設左手座標系的變更。 這個座標模型上的變更會影響遊戲的許多部分,從頂點緩衝區的設定與組態到許多矩陣數學函式。 要做的兩個最重要改變是:

  • 反向三角形頂點的順序,以便 Direct3D 從前面順時針方向遍歷它們。 例如,如果在 OpenGL 配管中將頂點索引為 0、1 和 2,則將其以 0、2、1 的形式傳遞給 Direct3D。
  • 使用檢視矩陣在 z 方向上以 –1.0f 縮放世界空間,有效反轉 z 軸座標。 若要這樣做,請在檢視矩陣中反轉 M31、M32 和 M33 位置的值符號 (當將其移轉至矩陣型別時)。 如果 M34 不是 0,也將其符號翻轉。

不過,Direct3D 可以支援右手座標系。 DirectX Math 提供許多在左手和右手座標繫上或之間操作的函式。 它們可用於保留部分原始網格資料和矩陣處理。 其中包含:

DirectX Math 矩陣函式 描述
XMMatrixLookAtLH 使用相機位置、向上方向及焦點建立左手座標系的檢視矩陣。
XMMatrixLookAtRH 使用相機位置、向上方向及焦點建立右手座標系的檢視矩陣。
XMMatrixLookToLH 使用相機位置、向上方向和相機方向建立左手座標系的檢視矩陣。
XMMatrixLookToRH 使用相機位置、向上方向和相機方向建立右手座標系的檢視矩陣。
XMMatrixOrthographicLH 建立左手座標系的正交投影矩陣。
XMMatrixOrthographicOffCenterLH 建立左手座標系的自訂正交投影矩陣。
XMMatrixOrthographicOffCenterRH 建立右手座標系的自訂正交投影矩陣。
XMMatrixOrthographicRH 建立右手座標系的正交投影矩陣。
XMMatrixPerspectiveFovLH 根據視場建立左手透視投影矩陣。
XMMatrixPerspectiveFovRH 根據視場建立右手透視投影矩陣。
XMMatrixPerspectiveLH 建立左手透視投影矩陣。
XMMatrixPerspectiveOffCenterLH 建立左手透視投影矩陣的自訂版本。
XMMatrixPerspectiveOffCenterRH 建立右手透視投影矩陣的自訂版本。
XMMatrixPerspectiveRH 建立右手透視投影矩陣。

 

OpenGL ES2.0 到 Direct3D 11 移植常見問題

  • 問題:一般來說,我能在 OpenGL 程式碼中搜尋某些字串或模式並用 Direct3D 對等項取代它們嗎?
  • 回答:否。 OpenGL ES 2.0 和 Direct3D 11 來自不同世代的圖形流程建模。 雖然概念和 API 之間有一些表面相似之處,例如渲染背景內容和著色器例項,但您應該檢視本指南以及 Direct3D 11 參考,以便您在重新建立流程時能夠作出最佳選擇,而不是嘗試進行1對1對映。 然而,如果你正在從 GLSL 轉換到 HLSL,建立一組 GLSL 變數、內建函數和函數的通用別名不僅可以使轉換更容易,還可以讓你只維護一組著色器代碼文件。