OpenGL是一個開放的系統,它是獨立于任何視窗系統或作業系統的。盡管它包含了許多圖形函數,但它卻沒有視窗函數,也沒有從鍵盤和滑鼠讀取事件的函數,是以要初學者寫出一個完整的圖形程式是相當困難的。另外,OpenGL圖形函數中隻提供基本的幾何原形:點、線、多邊形,是以要建立基本的三維幾何體如球、錐體等,也很不容易。而OpenGL輔助庫就是為解決這些基本問題專門設計的,它提供了一些基本的視窗管理函數和三維圖形繪制函數,能幫助初學者盡快進入OpenGL世界,掌握關鍵的三維圖形技術,體會其中奇妙的樂趣。但是,對于複雜的應用,這些函數遠遠不夠,隻能作為參考。
輔助庫函數分類
這一節内容可以作為手冊查閱,初學者不必深究。
輔助庫函數大緻分為六類:
1 視窗初始化和退出
相關函數有三個,它們在第一章已提到,這裡将詳細介紹:
void auxInitWindow(GLbyte *titleString)
打開一個由auxInitDisplayMode()和auxInitPosition()指定的視窗。函數參數是視窗标題,視窗背景預設顔色是RGBA下的黑色或顔色表(color_index)下的0号調色闆的顔色。按下Escape鍵可以完成關掉視窗、結束程式、全部清屏三項功能。
void auxInitDisplayMode(GLbitfield mask)
設定視窗顯示模式。基本模式有RGBA或顔色表、單或雙緩存,也可指定其他附加模式:深度、模闆或累積緩存(depth,stencil,and/or accumulation buffer)。參數mask是一組位标志的聯合(取或),AUX_RGBA或AUX_INDEX、AUX_SINGLE或AUX_DOUBLE,以及其它有效标志AUX_DEPTH、AUX_STENCIL或AUX_ACCUM。
void auxInitPosition(GLint x,GLint y,GLsizei width,GLsizei height)
設定視窗位置及大小。參數(x, y)為視窗的左上角點的螢幕坐标,參數(width, height)為視窗的寬度和高度,機關為象素,預設值為(0, 0, 100, 100)。
2 視窗處理和事件輸入
當視窗建立後,且在進入主函數循環之前,應當登記以下列出的回調函數(callback function):
void auxReshapeFunc(void(*function)(GLsizei,GLsizei))
定義視窗改變時形狀重定函數。參數function是一個函數指針,這個函數帶有兩個參數,即視窗改變後的新寬度和新高度。通常,function是glViewport(),顯示裁減後的新尺寸,重定義投影矩陣,以便使投影後圖像的比例與視點比對,避免比例失調。若不調用auxReshapeFunc(),預設重定物體形狀的函數功能是調用一個二維的正射投影矩陣。運用輔助庫,視窗将在每個事件改變後自動重新繪制。
void auxKeyFunction(GLint key,void(*function)(void))
定義鍵盤響應函數。參數function就是當按下key鍵時所調用的函數指針,輔助庫為參數key定義了幾個常量:AUX_0至AUX_9、AUX_A至AUX_Z、AUX_a至AUX_z、AUX_LEFT、AUX_RIGHT、AUX_UP、AUX_DOWN(方向鍵)、AUX_ESCAPE、AUX_SPACE或AUX_RETURN。
void auxMouseFunc(GLint button,Glint mode,void(*function)(AUX_EVENTREC *))
定義滑鼠響應函數。參數function就是當滑鼠以mode方式作用于button時所調用的函數。參數button有AUX_LEFTBUTTON、AUX_MIDDLEBUTTON或AUX_RIGHTBUTTON(以右手為标準)。參數mode代表滑鼠觸擊狀态,擊中時為AUX_MOUSEDOWN,釋放時為AUX_MOUSEUP。參數function必須帶一個參數,它是指向結構AUX_EVENNTREC的指針。當函數auxMouseFunc()被調用時将為這個結構配置設定相應的記憶體。通常用法類似如下:
- void function(AUX_EVENTREC *event)
- {
- GLint x,y;
- x=event->data[AUX_MOUSEX];
- y=event->data[AUX_MOUSEY];
- ...
- }
3 顔色表裝入
因為OpenGL本身沒有視窗系統,是以依賴于視窗系統的顔色映射就沒法裝入顔色查找表。如果采用顔色表模式,就要用到輔助庫提供的用RGB值定義的單個顔色索引函數:
void auxSetOneColor(GLint index,GLfloat red,GLfloat green,GLfloat blue)
設定自定義顔色的索引。參數index即索引号,參數red、green、blue分别為紅、綠、藍值,範圍在(0~1)内。
4 三維物體繪制
每組三維物體包括兩種形式:網狀體( wire )和實心體( solid )。網狀體沒有平面法向,而實心體有,能進行光影計算,有光照時采用實心體模型。下面這些函數的 參數都是定義物體大小的,可以改變。
功能 | 函數 |
繪制球 | void auxWireSphere(GLdouble radius) void auxSolidSphere(GLdouble radius) |
繪制立方體 | void auxWireCube(GLdouble size) void auxSolidCube(GLdouble size) |
繪制長方體 | void auxWireBox(GLdouble width,GLdouble height,GLdouble depth) void auxSolidBox(GLdouble width,GLdouble height,GLdouble depth) |
繪制環形圓紋面 | void auxWireTorus(GLdouble innerRadius,GLdouble outerRadius) void auxSolidTorus(GLdouble innerRadius,GLdouble outerRadius) |
繪制圓柱 | void auxWireCylinder(GLdouble radius,GLdouble height) void auxSolidCylinder(GLdouble radius,GLdouble height) |
繪制二十面體 | void auxWireIcosahedron(GLdouble radius) void auxSolidIcosahedron(GLdouble radius) |
繪制八面體 | void auxWireOctahedron(GLdouble radius) void auxSolidOctahedron(GLdouble radius) |
繪制四面體 | void auxWireTetrahedron(GLdouble radius) void auxSolidTetrahedron(GLdouble radius) |
繪制十二面體 | void auxWireDodecahedron(GLdouble radius) void auxSolidDodecahedron(GLdouble radius) |
繪制圓錐 | void auxWireCone(GLdouble radius,GLdouble height) void auxSolidCone(GLdouble radius,GLdouble height) |
繪制茶壺 | void auxWireTeapot(GLdouble size) void aucSolidTeapot(GLdouble size) |
以上物體均以各自中心為原點繪制,所有坐标都已機關化,可以縮放。
5 背景過程管理
void auxIdleFunc(void *func)
定義空閑狀态執行函數。參數func是一個指針,指向所要執行的函數功能。當它為零時,func執行無效。
6 程式運作
void auxMainLoop(void(*displayFunc)(void))
定義場景繪制循環函數。displayFunc指針指向場景繪制函數。當視窗需要更新或場景發生改變時,程式便調用它所指的函數,重新繪制場景。