接下來就是開始撰 寫程式, 建立 OpenGL 的 Framework。 一般 OpenGL 的程式流程是這樣的:
- Initial OpenGL Canvas
- Load 繪圖所需的資料 / 建立儲存資料的資料結構
- Initial OpenGL state 與 各種 OpenGL buffer objects
- Draw and Display
- 接 受各種事件,根據事件變更資料結構的內容、OpenGL State 或是 OpenGL buffer objects
- 反覆流程 4 與流程 5 直至程式結束
而流程 5 的事件種類 ( 如鍵盤按鍵、滑鼠、Timer、視窗縮放等),就取決於 GLUT、SDL、QT 這些 API 支援的程度而定。
以下先以 GLUT 為例的主程式:
int main( int argc, char* argv[] ) glewInit(); init(); glutDisplayFunc( display ); glutMainLoop(); |
其中下面的片段,是執行前述流程 1 的程式碼,負責設定 OpenGL Canvas 的一些參數後,產生 Canvas 。
glutInit( &argc, argv ); |
GLUT_RGBA 代表的是這個 Canvas 包含 RGB 以及 Alpha Channel 。
GLUT_DOUBLE 代表的是要求 Canvas 分為前景跟背景,這樣就可以同時顯示前景並更新背景影像,就不會因為只有一個前景而被看到畫一半的影像。
而這個參數會隨著使用的 API 為 GLUT、SDL、QT 等而能夠使用的參數會略微不同,詳細可以再去查各個 Function 的參數說明。
接 下來在 Windows 底下,使用 GLEW 將 OpenGL 1.1 之後的 Function 顯露出來,後面才能使用。
glewInit(); |
然後就是對應流程 2 與流程 3 的 Function,在 Function 裡面填入讀取資料與設定 然後產生 OpenGL Buffer Objects。
init(); initGL(); |
設定顯示的 Function 為 void display(),OpenGL 繪圖的動作可以寫在這裡。
glutDisplayFunc( display ); |
接著設定各種Event 所對應的處理Function ,例如 void reshape( int width, int height ) 是處理視窗大小改變時會執行的Function。而keyboard( unsigned char key, int x, int y )是處理鍵盤按鍵之後的反應。
glutReshapeFunc( reshape ); glutKeyboardFunc( keyboard ); |
最後便是讓程式透過 glutMainLoop 一直在流程 4 與流程 5 反覆執行。
glutMainLoop(); |
這樣就完成一個可以開始寫 OpenGL 來畫圖的開發環境與樣版程式了。