OpenGL輔助庫基本使用
阿新 • • 發佈:2019-02-06
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
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指標指向場景繪製函式。當視窗需要更新或場景發生改變時,程式便呼叫它所指的函式,重新繪製場景。