(轉)OpenGL開發庫的介紹

本博客計算機圖形學系列文章索引:

地址:《計算機圖形學系列相關文章索引(持續更新)》 


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

<庫前綴><根命令 ><可選的參數個數 ><可選的參數類型 >

庫前綴有 gl、glu、aux、glut、wgl、glx、agl等等,分別表示該函數屬於 OpenGL那個開發庫,從函數名後面中還可以看出需要多少個參數以及參數的類型。 I代表 int型,f代表 float型,d代表 double型,u代表無符號整型等等。例如glVertex3fv()表示了該函數屬於 gl庫,參數是三個 float型參數指針。

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

1OpenGL核心庫

核心庫包含有 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()。

2OpenGL實用庫 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後綴表明該擴展由多個賣主定義。

下面給出 OpenGL官方規定的命名規則:

• ARB – OpenGL Architecture Review Board正式覈準的擴展,往往由廠商開發的擴展發展而來,如果同時存在廠商開發的擴展和 ARB擴展,應該優先使用 ARB擴展;

• EXT–多家 OpenGL廠商同意支持的擴展;

• HP – Hewlett-Packard惠普;

• IBM – International Business Machines ;

• KTX – Kinetix, maker of 3D Studio Max;

• INTEL – Intel 公司;

• NV – NVIDIA公司;

• MESA – Brian Paul’s freeware portable OpenGL implementation;

• SGI – Silicon Graphics公司開發的擴展;

• SGIX – Silicon Graphics (experimental) 公司開發的實驗性擴展;

• SUN – Sun Microsystems;

• WIN – Microsoft 。

由於 OpenGL擴展在針對不同平臺和不同驅動, OpenGL不可能把所有的接口程序全部放到 gl.h、glx.h、wgl.h中,而是將這些函數頭放在了 glext.h、glxext.h和 wglext.h中。這些擴展被看作時 OpenGL核心庫規範的增加和修改。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章