|
用OpenGL編寫的程式結構類似於用其他語言編寫的程式。實際上,OpenGL是一個豐富的三維圖形函數庫,編寫OpenGL程式並非難事,只需在基本C語言中調用這些函數,用法同Turbo C、Microsoft C等類似,但也有許多不同之處。 本指南所有的程式都是在Windows NT的Microsoft Visual C++Integration Environment下編譯串連的,其中有部分標頭檔和函數是為這個環境所用的,例如判別作業系統的標頭檔“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程式基本結構為定義視窗、清理視窗、繪製物體、結束運行。 |