跳轉至內容

OpenGL 程式設計/從 1.x 遷移到 2.x

來自華夏公益教科書

OpenGL ES 2.0 中大部分 OpenGL 1.x 都不可用,而 OpenGL 3.x 和 OpenGL 4.x 已棄用它們(這些特性仍然可以在“相容性配置檔案”中使用,但可以預期這些特性很快就會消失)。

但是,關於如何在新的版本中替換這些特性,人們很少提及。下面介紹如何操作。

矩陣堆疊

[編輯 | 編輯原始碼]

已棄用函式:glIdentity、glRotate、glOrtho、gluOrtho...

矩陣數學運算可以完成以下操作

GLM 提供 glm::ortho 來替換 glOrtho 和 gluOrtho 以進行正交透視(和 2D 程式設計)。

示例

頂點和紋理

[編輯 | 編輯原始碼]

已棄用函式:glVertex、glTexCoord...

這些資料現在以批處理模式作為 C 陣列傳送。您可以使用

  • 直接使用 C 陣列:每幀重新發送資料
  • glBufferData:將 C 資料傳送到顯示卡一次,然後引用該緩衝區

您對每個頂點屬性(位置、顏色、紋理座標...)使用 glVertexAttribPointer 一次,將 C 陣列或 OpenGL 緩衝區傳遞給它。

示例

然後您使用 glDrawArrays 或 glDrawElements 開始繪製。

已棄用函式:glNormal、glNormalPointer

法線需要傳遞給著色器(主要是為了進行著色計算),就像向量座標 (glVertexAttribPointer) 一樣。要計算逆時針順序的 3 個頂點 a、b 和 c 的法線,GLM 提供

glm::normalize(glm::cross(b - a, c - a));
glm::fastNormalize(glm::cross(b - a, c - a));  // faster but less accurate

示例

求值器 - 貝塞爾曲線和曲面

[編輯 | 編輯原始碼]

已棄用函式:glMap1、glMap2、glEvalCoord、glEvalPoint...

  • GLU ES - http://code.google.com/p/glues/ - 這是針對 OpenGL 1.x 的,因此它可能無法在 2.x 環境中工作,但提供了替換程式碼
  • 手動程式碼(並不難)

示例

已棄用函式:glLight (glLightfv3 等)、glShadeModel...

壞訊息是您必須在著色器中重新實現所有內容。好訊息是這並不那麼難,而且您可以在下面的示例中找到可以複製貼上的程式碼:)

您還需要將光照引數提供給您的著色器,最好將它們儲存為著色器 struct

示例

< OpenGL 程式設計

瀏覽並下載 完整程式碼
華夏公益教科書