將簡單的 OpenGL ES 2.0 轉譯器連線至 Direct3D 11

在此移植練習中,我們將從基本概念開始:將簡單的轉譯器從 OpenGL ES 2.0 帶入 Direct3D,使其符合 Visual Studio 2015 的 DirectX 11 應用程式 (通用 Windows) 範本。 當我們逐步解說此移植程序時,您將瞭解下列內容:

  • 如何將一組簡單的頂點緩衝區移植到 Direct3D 輸入緩衝區
  • 如何將統一和屬性移植到常數緩衝區
  • 如何設定 Direct3D 著色器物件
  • Direct3D 著色器開發中如何使用基本 HLSL 語意
  • 如何將非常簡單的 GLSL 移植到 HLSL

本主題會在您建立新的 DirectX 11 專案之後開始。 若要瞭解如何建立新的 DirectX 11 專案,請閱讀為通用 Windows 平台 (UWP) 建立新的 DirectX 11 專案

從任一連結建立的專案已準備好 Direct3D 基礎結構的所有程式碼,您可以立即開始將轉譯器從 Open GL ES 2.0 移植到 Direct3D 11 的程序。

本主題會逐步解說執行相同基本圖形工作的兩個程式碼路徑:在視窗中顯示旋轉的頂點著色立方體。 在這兩種情況下,程式碼涵蓋下列程序:

  1. 從硬式編碼的資料建立立方體網格。 此網格會以頂點清單表示,每個頂點都有位置、一般向量和色彩向量。 此網格被放入頂點緩衝區中以供著色管線進行處理。
  2. 建立著色器物件來處理立方體網格。 有兩個著色器:處理頂點以進行點陣化的頂點著色器,以及在點陣化後為立方體的各個像素著色的片段 (像素) 著色器。 這些像素會寫入轉譯目標以供顯示。
  3. 形成分別用於頂點著色器和片段著色器中的頂點和像素處理的著色語言。
  4. 在畫面上顯示轉譯的立方體。

simple opengl cube

完成本逐步解說之後,您應該熟悉 Open GL ES 2.0 與 Direct3D 11 之間的下列基本差異:

  • 頂點緩衝區和頂點資料的表示法。
  • 建立和設定著色器的程序。
  • 著色語言,以及著色器物件的輸入和輸出。
  • 畫面繪圖行為。

在本逐步解說中,我們會參考簡單且一般的 OpenGL 轉譯器結構,其定義如下:

typedef struct 
{
    GLfloat pos[3];        
    GLfloat rgba[4];
} Vertex;

typedef struct
{
  // Integer handle to the shader program object.
  GLuint programObject;

  // The vertex and index buffers
  GLuint vertexBuffer;
  GLuint indexBuffer;

  // Handle to the location of model-view-projection matrix uniform
  GLint  mvpLoc; 
   
  // Vertex and index data
  Vertex  *vertices;
  GLuint   *vertexIndices;
  int       numIndices;

  // Rotation angle used for animation
  GLfloat   angle;

  GLfloat  mvpMatrix[4][4]; // the model-view-projection matrix itself
} Renderer;

此結構有一個執行個體,並包含轉譯非常簡單頂點著色網格所需的所有元件。

注意:本主題中的任何 OpenGL ES 2.0 程式碼都是以 Khronos 群組所提供的 Windows API 實作為基礎,並使用 Windows C 程式設計語法。

 

您需要瞭解的資訊

技術

必要條件

步驟

主題 說明

移植著色器物件

從 OpenGL ES 2.0 移植簡單轉譯器時,第一步是在 Direct3D 11 中設定等效的頂點和片段著色器物件,並確保主程式在編譯後可以與著色器物件進行通訊。

移植頂點緩衝區和資料

在此步驟中,您將定義包含網格的頂點緩衝區,以及允許著色器以指定順序周遊頂點的索引緩衝區。

移植 GLSL

一旦您完成了建立和設定緩衝區和著色器物件的程式碼,就可以將這些著色器內的程式碼從 OpenGL ES 2.0 的 GL 著色器語言 (GLSL) 移植到 Direct3D 11 的高階著色器語言 (HLSL)。

繪製到螢幕

最後,我們將繪製旋轉立方體的程式碼移植到畫面上。

 

其他資源