OpenGL基礎圖形程式設計(四)基礎程式結構

heyuchang666發表於2016-04-06
四、OpenGL基礎程式結構

  用OpenGL編寫的程式結構類似於用其他語言編寫的程式。實際上,OpenGL是一個豐富的三維圖形函式庫,編寫OpenGL程式並非難事,只需在基本C語言中呼叫這些函式,用法同Turbo C、Microsoft C等類似,但也有許多不同之處。
  本指南所有的程式都是在Windows NT的Microsoft Visual C++整合環境下編譯連線的,其中有部分標頭檔案和函式是為這個環境所用的,例如判別作業系統的標頭檔案“glos.h”。此外,為便於各類讀者同時快速入門,在短時間內掌握OpenGL程式設計的基本方法和技巧,指南中例子儘量採用標準ANSI C呼叫OpenGL函式來編寫,而且所有例程都只採用OpenGL附帶的輔助庫中的視窗系統。此外,這樣也便於程式在各平臺間移植,尤其往工作站UNIX 作業系統移植時,也只需改動標頭檔案等很少很少的部分。下面列出一個簡單的OpenGL程式:
  例4-1 OpenGL簡單例程Simple.c
   #include <GL/gl.h>
  #include <GL/glaux.h>
  #include "glos.h"

  void main(void)
  {
    auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);
    auxInitPosition(0,0,500,500);
    auxInitWindow("simple");

    glClearColor(0.0,0.0,0.0,0.0);
    glClear(GL_COLOR_BUFFER_BIT);

     glColor3f(1.0,0.0,0.0);
    glRectf(-0.5,-0.5,0.5,0.5);

     glFlush();
    _sleep(1000);
  }
  這個程式執行結果是在螢幕視窗內畫一個紅色的方塊。
  下面具體分析整個程式結構:首先,在程式最開始處是OpenGL標頭檔案:<GL/gl.h>、<GL/glaux.h>。前一個是gl庫的標頭檔案,後一個是輔助庫的標頭檔案。此外,在以後的幾章中還將說明OpenGL的另外兩個標頭檔案,一個是<GL/glu.h>實用庫的標頭檔案,另一個是<GL/glx.h>X視窗擴充庫的標頭檔案(這個常用在工作站上)。接下來是主函式main()的定義:一般的程式結構是先定義一個視窗: 
auxInitDisplayMode(AUX_SINGLE|AUX_RGBA);
auxInitPosition(0,0,500,500);
auxInitWindow("simple");

  auxInitDisplayMode(AUX_SINGLE|AUX_RGBA)設定視窗顯示模式為RGBA方式,即彩色方式,並且圖形快取為單快取(SINGLE
 BUFFER)。 auxInitPosition(0, 0, 500, 500)定義視窗的初始位置,前兩個引數(0, 0)為視窗的左上角點的螢幕座標,後兩個引數(500,500)為視窗的寬度和高度。auxInitWindow("simple")是視窗初始化,字元引數是視窗名稱。
  然後是視窗內清屏:
glClearColor(0.0,0.0,0.0,0.0); 
glClear(GL_COLOR_BUFFER_BIT);
  第一句將視窗清為黑色,第二句將顏色緩衝區清為glClearColor(0.0, 0.0, 0.0, 0.0)命令所設定的顏色,即同視窗背景顏色一致。
  再接著是在視窗內畫一個物體:
glColor3f(1.0,0.0,0.0);
glRectf(-0.5,-0.5,0.5,0.5);
  很明顯,第一句設定物體顏色,函式中前三個引數分別為R、G、B值,最後一個引數是Alpha值,範圍都從0至1;第二句繪製一個二維矩形。注意:OpenGL是針對三維圖形而言,因此用作OpenGL程式設計繪製物體必須意識到任何一個物體都是三維的,具有空間性,而顯示於螢幕上的物體都是三維物體在二維平面上的投影。
  從表面上看,上述程式程式碼很簡單,實際上已經用到了預設的投影形式(正射投影)。再看glFlush()函式,表示強制繪圖完成。最後一句_sleep(1000),引數單位為毫秒,整句意思是保持現有狀況一秒鐘,然後結束程式執行。這個函式是VC++的庫函式。
  總而言之,OpenGL程式基本結構為定義視窗、清理視窗、繪製物體、結束執行。 

相關文章