OpenGL 3.x 教學: 第0章: 準備OpenGL的開發環境(下)

接下來就是開始撰 寫程式, 建立 OpenGL 的 Framework。 一般 OpenGL 的程式流程是這樣的:

  1. Initial OpenGL Canvas
  2. Load 繪圖所需的資料 / 建立儲存資料的資料結構
  3. Initial OpenGL state 與 各種 OpenGL buffer objects
  4. Draw and Display
  5. 接 受各種事件,根據事件變更資料結構的內容、OpenGL State 或是 OpenGL buffer objects
  6. 反覆流程 4 與流程 5 直至程式結束

而流程 5 的事件種類 ( 如鍵盤按鍵、滑鼠、Timer、視窗縮放等),就取決於 GLUT、SDL、QT 這些 API 支援的程度而定。

以下先以 GLUT 為例的主程式:

int main( int argc, char* argv[] )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE );
glutCreateWindow( argv[0] );

glewInit();

init();
initGL();

glutDisplayFunc( display );
glutReshapeFunc( reshape );
glutKeyboardFunc( keyboard );

glutMainLoop();
}

其中下面的片段,是執行前述流程 1 的程式碼,負責設定 OpenGL Canvas 的一些參數後,產生 Canvas 。

glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE );
glutCreateWindow( argv[0] );

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 來畫圖的開發環境與樣版程式了。

GLUT 範例程式下載

SDL範例程式下載 (Reference and Modify from NeHe OpenGL Basecode)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。