[CS193P] 第十九堂課摘要及心得筆記

評論
評論

在最後一堂的課程當中,我們將簡略的學習 OpenGL ES 的一些概念,讓我們對 iPhone 平台上的 3D 遊戲開發多增加一些概念。還請大家多多指教!

OpenGL 簡介

OpenGL 是一套跨語言、跨系統的軟體介面,藉由這些函式讓我們可以用同樣的語法操作不同的繪圖硬體,並產生 2D、3D 的圖像。而 OpenGL ES 就是專門設計給行動裝置使用的 OpenGL 版本,擁有 OpenGL 的許多功能,是一個子集合。

但要注意的是,許多現在通用的 OpenGL 書籍、函式庫,並不能直接在 OpenGL ES 上使用,必須多加注意。

而 OpenGL 是一個狀態機,會紀錄當下的環境狀態,像是繪圖的顏色等資訊,而直到我們呼叫函式改變。

像是以下這些函式變可以修改狀態:

glEnable(); glDisable(); glMatrixMode(); glBindFramebufferOES(); glViewport(); glVertexPointer(); glColorPointer(); glTranslatef();…

而根據不同的狀態,我們呼叫同樣的函式也可能會有不同的結果。像是以下這些繪圖函式:

glDrawArrays(); glDrawElements();…

便會依照前面所修改的狀態,進行對應的繪圖功能。

座標系統

要進行繪圖必然得先有定位的系統,才能與繪圖介面進行溝通。在 OpenGL 中便提供多種呈階層關係的座標系統,分別是:

  • Window Coordinates
  • Normalized Device Coordinates
  • Clip and Eye Coordinates
  • World Coordinates
  • Object Coordinates

Windows Coordinates 就是以螢幕的左上角的點為 (0,0),一直延伸到 iPhone 的右下角,也就是 (320, 480),與我們以前用 UIView 的座標系統相當類似,如下圖:

而 Normalized Device Coordinates 是將螢幕的正中央設定為 (0,0,0),做一個四邊體的 3D 空間,如下圖:

Eye Coordinates 則是以使用者的眼睛作為 (0,0,0),在螢幕後方投影出一個四邊體的 3D 空間,如下圖:

World Coordinates 便是用來描述場景的座標,我們通常會透過這個座標來描述物體和光源的位置。而 Object Coordinates 則是對每個不同的物件所使用的獨立座標系統。

基本上,這些座標系統可能對初次接觸的讀者來說有點複雜,有興趣的讀者可以上網參考相關網站,以便釐清觀念。

幾何繪圖

OpenGL ES 可以繪製三角形、線還有點,透過這幾個基本的元素,變可以讓我們畫出其他更複雜的 3D 立體物件。而在繪製的操作上,我們主要透過提供給 OpenGL 一系列儲存在陣列的頂點,讓其能夠沿著這些頂點繪製出我們所需要的圖形。

此外,我們也可以針對每個頂點設定 RGBA 的顏色,OpenGL 便會依照頂點的顏色填滿所繪製出來的三角形或是線。而這些顏色,也是透過陣列的方式傳遞。

傳遞進去的頂點順序也是值得注意的一部分,以下是幾種常用的圖形所規定的順序:

虛線的部份則是代表著正反面的差別,我們可以看到右手邊的 GL_TRIANGLES 的順序是逆時針的,其正面便會朝上。而右手邊、順時針的則是反面朝上。

在課程的影片中有示範如何透過 GL_TRIANGLE_STRIP 在 3D 空間中繪製四面體,有興趣的讀者還請務必參考。

材質貼圖

當我們順利完成 3D 模型的繪製,我們也會希望在這些 3D 物件上能夠有漂亮的外觀。我們可以透過使用材質貼圖來協助。這些材質其實就是儲存在記憶體中的 2D 影像圖檔,如下:

而我們只需要將繪圖的各個頂點,分別對應到材質上的 (u, v) 座標,OpenGL 就會幫我們完成貼圖。

然而,假使我們要繪製一個四面體,若是針對每一個面都要切換材質這樣會很沒有效率。因此,我們可以設計一個大張的材質,讓每一面都可以透過同一材質進行貼圖。

在課程影片中,同樣有對於貼圖進行示範,有興趣的讀者還請參考。

其他細節

OpenGL ES 目前有兩種版本,分別是 1.1 和 2.0 版。在 iPhone 3GS 以前,所有的裝置均只支援 1.1 版。而本次課程的內容也均為 1.1 版的內容。

由於 OpenGL ES 2.0 做了相當大的改變,以使用 shader 為主,提供了更多的彈性卻也更難上手。若只是要設計一般的 3D 遊戲,那其實只需要使用 1.1 版就可以有很好的效果。

結論

這次的課程內容雖然只涵蓋到了 OpenGL ES 中的很小部份,但卻讓我們對於 iPhone 上的 3D 繪圖有了基本的認識。本連載在此畫下了句點,以後筆者仍然會繼續在 Inside 團隊中撰寫、分享 iPhone 平台的開發心得,還請大家繼續支持!

參考資源

相關文章

評論