[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平台的開發心得,還請大家繼續支持!












關於作者: Richard (93 篇文章)
九零後的部落客,平日關注於社群媒體以及行動上網的相關話題。近日主要工作為開發iPhone及iPad的應用程式,歡迎各位讀者與我交流。Twitter/Facebook: @dlackty、Email: dlackty@gmail.com。