1. 程式人生 > >OpenGL庫介紹

OpenGL庫介紹

  開發基於OpenGL的應用程式,必須先了解OpenGL的庫函式。它採用C語言風格,提供大量的函式來進行圖形的處理和顯示。OpenGL庫函式的命名方式非常有規律。所有OpenGL函式採用了以下格式:

    <庫字首><根命令><可選的引數個數><可選的引數型別>

  庫字首,有gl、glu、aux、glut、wgl、glx、agl等等,分別表示該函式屬於OpenGL那個開發庫。
    從函式名後面中還可以看出需要多少個引數以及引數的型別。I代表int型,f代表float型,d代表double型,u代表無符號整型。    
    例如glVertex3fv()表示了該函式屬於gl庫,引數是三個float型引數指標。我們用glVertex*()來表示這一類函式。

  OpenGL函式庫相關的API有核心庫(gl)、實用庫(glu)、輔助庫(aux)、實用工具庫(glut)、視窗庫(glx、agl、wgl)和擴充套件函式庫等。從下圖可以看出,gl是核心,glu是對gl的部分封裝。glx、agl、wgl 是針對不同視窗系統的函式。glut是為跨平臺的OpenGL程式的工具包,比aux功能強大。擴充套件函式庫是硬體廠商為實現硬體更新利用OpenGL的擴充套件機制開發的函式。下面逐一對這些庫進行詳細介紹。

1.OpenGL核心庫

  核心庫包含有115個函式,函式名的字首為gl。這部分函式用於常規的、核心的圖形處理。此函式由gl.dll來負責解釋執行。由於許多函式可以接收不同數以下幾類。據型別的引數,因此派生出來的函式原形多達300多個。核心庫中的函式主要可以分為以下幾類函式:

  ◇ 繪製基本幾何圖元的函式:glBegain()、glEnd()、glNormal*()、glVertex*(); 
  ◇ 矩陣操作、幾何變換和投影變換的函式:如矩陣入棧函式glPushMatrix(),矩陣出棧函式glPopMatrix(),裝載矩陣函式glLoadMatrix(),矩陣相乘函式glMultMatrix(),當前矩陣函式glMatrixMode()和矩陣標準化函式glLoadIdentity(),幾何變換函式glTranslate*()、glRotate*()和glScale*(),投影變換函式glOrtho()、glFrustum()和視口變換函式glViewport();
  ◇ 顏色、光照和材質的函式:如設定顏色模式函式glColor*()、glIndex*(),設定光照效果的函式glLight*() 、glLightModel*()和設定材質效果函式glMaterial();
  ◇ 顯示列表函式:主要有建立、結束、生成、刪除和呼叫顯示列表的函式glNewList()、glEndList()、glGenLists()、glCallList()和glDeleteLists();
  ◇ 紋理對映函式:主要有一維紋理函式glTexImage1D()、二維紋理函式glTexImage2D()、設定紋理引數、紋理環境和紋理座標的函式glTexParameter*()、glTexEnv*()和glTetCoord*();
  ◇ 特殊效果函式:融合函式glBlendFunc()、反走樣函式glHint()和霧化效果glFog*();
  ◇ 光柵化、象素操作函式:如象素位置glRasterPos*()、線型寬度glLineWidth()、多邊形繪製模式glPolygonMode(),讀取象素glReadPixel()、複製象素glCopyPixel();
  ◇ 選擇與反饋函式:主要有渲染模式glRenderMode()、選擇緩衝區glSelectBuffer()和反饋緩衝區glFeedbackBuffer();
  ◇ 曲線與曲面的繪製函式:生成曲線或曲面的函式glMap*()、glMapGrid*(),求值器的函式glEvalCoord*() glEvalMesh*();
  ◇ 狀態設定與查詢函式:glGet*()、glEnable()、glGetError()。

2.OpenGL實用庫The OpenGL Utility Library (GLU)

  包含有43個函式,函式名的字首為glu。OpenGL提供了強大的但是為數不多的繪圖命令,所有較複雜的繪圖都必須從點、線、面開始。Glu 為了減輕繁重的程式設計工作,封裝了OpenGL函式,Glu函式通過呼叫核心庫的函式,為開發者提供相對簡單的用法,實現一些較為複雜的操作。此函式由glu.dll來負責解釋執行。OpenGL中的核心庫和實用庫可以在所有的OpenGL平臺上執行。主要包括了以下幾種:

  ◇ 輔助紋理貼圖函式:gluScaleImage() 、gluBuild1Dmipmaps()、gluBuild2Dmipmaps(); 
  ◇ 座標轉換和投影變換函式:定義投影方式函式gluPerspective()、gluOrtho2D() 、gluLookAt(),拾取投影視景體函式gluPickMatrix(),投影矩陣計算gluProject()和gluUnProject();
  ◇ 多邊形鑲嵌工具:gluNewTess()、gluDeleteTess()、gluTessCallback()、gluBeginPolygon()、gluTessVertex()、gluNextContour()、gluEndPolygon();
  ◇ 二次曲面繪製工具,主要有繪製球面、錐面、柱面、圓環面gluNewQuadric()、gluSphere()、gluCylinder()、gluDisk()、gluPartialDisk()、gluDeleteQuadric();
  ◇ 非均勻有理B樣條繪製工具:主要用來定義和繪製Nurbs曲線和曲面,包括gluNewNurbsRenderer()、gluNurbsCurve()、gluBeginSurface()、gluEndSurface()、gluBeginCurve()、gluNurbsProperty();
  ◇ 錯誤反饋工具:獲取出錯資訊的字串gluErrorString()。

3.OpenGL輔助庫

  包含有31個函式,函式名字首為aux。這部分函式提供視窗管理、輸入輸出處理以及繪製一些簡單三維物體。此函式由glaux.dll來負責解釋執行。建立aux庫是為了學習和編寫OpenGL程式,它更像是一個用於測試創意的預備基礎接管。Aux庫在windows實現有很多錯誤,因此很容易導致頻繁的崩潰。在跨平臺的程式設計例項和演示中,aux很大程度上已經被glut庫取代OpenGL中的輔助庫不能在所有的OpenGL平臺上執行
  輔助庫函式主要包括以下幾類:

  ◇ 視窗初始化和退出函式:auxInitDisplayMode()和auxInitPosition(); 
  ◇ 視窗處理和時間輸入函式:auxReshapeFunc()、auxKeyFunc()和auxMouseFunc(); 
  ◇ 顏色索引裝入函式:auxSetOneColor(); 
  ◇ 三維物體繪製函式:包括了兩種形式網狀體和實心體,如繪製立方體auxWireCube()和 auxSolidCube()。這裡以網狀體為例,長方體auxWireBox()、環形圓紋面auxWireTorus()、圓柱auxWireCylinder()、二十面體auxWireIcosahedron()、八面體auxWireOctahedron()、四面體auxWireTetrahedron()、十二面體auxWireDodecahedron()、圓錐體auxWireCone()和茶壺auxWireTeapot(); 
  ◇ 背景過程管理函式:auxIdleFunc();
  ◇ 程式執行函式:auxMainLoop()。

4.OpenGL工具庫 OpenGL Utility Toolkit

  包含大約30多個函式,函式名字首為glut。glut是不依賴於視窗平臺的OpenGL工具包,由Mark KLilgrad在SGI編寫(現在在Nvidia),目的是隱藏不同視窗平臺API的複雜度。函式以glut開頭,它們作為aux庫功能更強的替代品,提供更為複雜的繪製功能,此函式由glut.dll來負責解釋執行。由於glut中的視窗管理函式是不依賴於執行環境的,因此OpenGL中的工具庫可以在X-Window, Windows NT, OS/2等系統下執行,特別適合於開發不需要複雜介面的OpenGL示例程式。對於有經驗的程式設計師來說,一般先用glut理順3D圖形程式碼,然後再整合為完整的應用程式。

  這部分函式主要包括:

  ◇ 視窗操作函式:視窗初始化、視窗大小、視窗位置函式等[glutInit()、glutInitDisplayMode()、glutInitWindowSize()、glutInitWindowPosition()];
  ◇ 回撥函式:響應重新整理訊息、鍵盤訊息、滑鼠訊息、定時器函式[GlutDisplayFunc()、glutPostRedisplay()、glutReshapeFunc()、glutTimerFunc()、glutKeyboardFunc()、glutMouseFunc()];
  ◇ 建立複雜的三維物體:這些和aux庫的函式功能相同;
  ◇ 選單函式:建立新增選單的函式GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu()和glutAttachMenu();
  ◇ 程式執行函式:glutMainLoop()。

5.Windows專用庫

  針對windows平臺的擴充套件,包含有16個函式,函式名字首為wgl。這部分函式主要用於連線OpenGL和Windows ,以彌補OpenGL在文字方面的不足。   Windows專用庫只能用於Windows環境中。

  這類函式主要包括以下幾類:

  ◇ 繪圖上下文相關函式:wglCreateContext()、wglDeleteContext()、wglGetCurrentContent()、wglGetCurrentDC()、wglDeleteContent();
  ◇ 文字和文字處理函式:wglUseFontBitmaps()、wglUseFontOutlines();
  ◇ 覆蓋層、地層和主平面層處理函式:wglCopyContext()、wglCreateLayerPlane()、wglDescribeLayerPlane()、wglReakizeLayerPlatte();
  ◇ 其他函式:wglShareLists()、wglGetProcAddress()。

6.Win32 API函式庫

  包含有6個函式,函式名無專用字首,是win32擴充套件函式。這部分函式主要用於處理畫素儲存格式和雙幀快取;這6個函式將替換Windows GDI中原有的同樣的函式。Win32API函式庫只能用於Windows 95/98/NT環境中。

7.X視窗專用庫

  是針對Unix和Linux的擴充套件函式。包括渲染上下文、繪製圖元、顯示列表、紋理貼圖等;

  ◇ 初始化:glXQueryExtension(); 
  ◇ 渲染上下文函式:glXCreateContext()、glXDestroyContext()、glXCopyContext()、glXMakeCurrent()、glXCreateGLXPixmap();
  ◇ 執行:glXWaitGL()、glXWaitX();
  ◇ 緩衝區和字型:glXSwapBuffers()、glXUseXFont()。

8.其他擴充套件庫

  這些函式可能是新的OpenGL函式,並沒有在標準OpenGL庫中實現,或者它們是用來擴充套件已存在的OpenGL函式的功能。和glu、glx和wgl一樣,這些OpenGL擴充套件是由硬體廠商和廠商組織開發的。OpenGL擴充套件(OpenGL Extention)包含了大量的擴充套件API函式。

  隨著硬體的更新,硬體廠商首先向SGI申請登記新的擴充套件,編寫規格說明書(specification)。然後按照說明書進行開發擴充套件程式。不同的OpenGL實現(OpenGL Implementation)支援的擴充套件可能不一樣,只有隨著某一擴充套件的推廣與應用以及硬體技術的提高該擴展才會在所有的OpenGL實現中被給予支援,從而最終成為OpenGL標準庫的一部分。擴充套件由SGI維護,在SGI網站上列出了目前公開的已註冊的擴充套件及其官方說明書。擴充套件源由擴充套件函式的字尾來指明(或使用擴充套件常量字尾)。例如,字尾WIN表明一個符合Windows規範的擴充套件,EXT或ARB字尾表明該擴充套件由多個賣主定義。