1. 程式人生 > >OpenGL輔助庫基本使用

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