天天看點

OpenGL輔助庫基本使用

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()被調用時将為這個結構配置設定相應的記憶體。通常用法類似如下:

  1. void function(AUX_EVENTREC *event)  
  2.   {  
  3.     GLint x,y;  
  4.     x=event->data[AUX_MOUSEX];  
  5.     y=event->data[AUX_MOUSEY];  
  6.     ...  
  7.   }  

  

   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指針指向場景繪制函數。當視窗需要更新或場景發生改變時,程式便調用它所指的函數,重新繪制場景。