開發(fā)基于OpenGL的應用程序,必須先了解OpenGL的庫函數(shù)。它采用C語言風格,提供大量的函數(shù)來進行圖形的處理和顯示。OpenGL庫函數(shù)的命名方式非常有規(guī)律。所有OpenGL函數(shù)采用了以下格式:
<庫前綴><根命令><可選的參數(shù)個數(shù)><可選的參數(shù)類型>
庫前綴有gl、glu、aux、glut、wgl、glx、agl等等,分別表示該函數(shù)屬于OpenGL那個開
發(fā)庫,從函數(shù)名后面中還可以看出需要多少個參數(shù)以及參數(shù)的類型。I代表int型,f代表float型,d代表double型,u代表無符號整型。例如 glVertex3fv()表示了該函數(shù)屬于gl庫,參數(shù)是三個float型參數(shù)指針。我們用glVertex*()
來表示這一類函數(shù)。

OpenGL函數(shù)庫相關的API有核心庫(gl)、實用庫(glu)、輔助庫(aux)、實用工具庫(glut)、窗口庫(glx、 agl、wgl)和擴展函數(shù)庫等。從圖可以看出,gl是核心,glu是對gl的部分封裝。glx、agl、wgl 是針對不同窗口系統(tǒng)的函數(shù)。glut是為跨平臺的OpenGL程序的工具包,比aux功能強大。擴展函數(shù)庫是硬件廠商為實現(xiàn)硬件更新利用OpenGL的擴 展機制開發(fā)的函數(shù)。下面逐一對這些庫進行詳細介紹。
1.OpenGL核心庫
核心庫包含有115個函數(shù),函數(shù)名的前綴為gl。這部分函數(shù)用于常規(guī)的、核心的圖形處理。此函數(shù)由gl.dll來負責解釋執(zhí)行。由于許多函數(shù)可以接收不同數(shù)以下幾類。據(jù)類型的參數(shù),因此派生出來的函數(shù)原形多達300多個。核心庫中的函數(shù)主要可以分為以下幾類函數(shù):
- 繪制基本幾何圖元的函數(shù):glBegain()、glEnd()、glNormal*()、glVertex*();
- 矩陣操作、幾何變換和投影變換的函數(shù):如矩陣入棧函數(shù)glPushMatrix(),矩陣出棧函數(shù)glPopMatrix(),裝載矩陣函數(shù) glLoadMatrix(),矩陣相乘函數(shù)glMultMatrix(),當前矩陣函數(shù)glMatrixMode()和矩陣標準化函數(shù) glLoadIdentity(),幾何變換函數(shù)glTranslate*()、glRotate*()和glScale*(),投影變換函數(shù) glOrtho()、glFrustum()和視口變換函數(shù)glViewport();
- 顏色、光照和材質(zhì)的函數(shù):如設置顏色模式函數(shù)glColor*()、glIndex*(),設置光照效果的函數(shù)glLight*() 、glLightModel*()和設置材質(zhì)效果函數(shù)glMaterial();
- 顯示列表函數(shù):主要有創(chuàng)建、結(jié)束、生成、刪除和調(diào)用顯示列表的函數(shù)glNewList()、glEndList()、glGenLists()、glCallList()和glDeleteLists();
- 紋理映射函數(shù):主要有一維紋理函數(shù)glTexImage1D()、二維紋理函數(shù)glTexImage2D()、設置紋理參數(shù)、紋理環(huán)境和紋理坐標的函數(shù)glTexParameter*()、glTexEnv*()和glTetCoord*();
- 特殊效果函數(shù):融合函數(shù)glBlendFunc()、反走樣函數(shù)glHint()和霧化效果glFog*();
- 光柵化、象素操作函數(shù):如象素位置glRasterPos*()、線型寬度glLineWidth()、多邊形繪制模式glPolygonMode(),讀取象素glReadPixel()、復制象素glCopyPixel();
- 選擇與反饋函數(shù):主要有渲染模式glRenderMode()、選擇緩沖區(qū)glSelectBuffer()和反饋緩沖區(qū)glFeedbackBuffer();
- 曲線與曲面的繪制函數(shù):生成曲線或曲面的函數(shù)glMap*()、glMapGrid*(),求值器的函數(shù)glEvalCoord*() glEvalMesh*();
- 狀態(tài)設置與查詢函數(shù):glGet*()、glEnable()、glGetError()。
2.OpenGL實用庫The OpenGL Utility Library (GLU)
包含有43個函數(shù),函數(shù)名的前綴為glu。OpenGL提供了強大的但是為數(shù)不多的繪圖命令,所有較復雜的繪圖都必須從點、線、面開始。Glu
為了減輕繁重的編程工作,封裝了OpenGL函數(shù),Glu函數(shù)通過調(diào)用核心庫的函數(shù),為開發(fā)者提供相對簡單的用法,實現(xiàn)一些較為復雜的操作。此函數(shù)由 glu.dll來負責解釋執(zhí)行。OpenGL中的核心庫和實用庫可以在所有的OpenGL平臺上運行。主要包括了以下幾種:
- 輔助紋理貼圖函數(shù):gluScaleImage()
、gluBuild1Dmipmaps()、gluBuild2Dmipmaps();
- 坐標轉(zhuǎn)換和投影變換函數(shù):定義投影方式函數(shù)gluPerspective()、gluOrtho2D() 、gluLookAt(),拾取投影視景體函數(shù)gluPickMatrix(),投影矩陣計算gluProject()和gluUnProject();
- 多邊形鑲嵌工具:gluNewTess()、gluDeleteTess()、gluTessCallback()、gluBeginPolygon()、gluTessVertex()、gluNextContour()、gluEndPolygon();
- 二次曲面繪制工具,主要有繪制球面、錐面、柱面、圓環(huán)面gluNewQuadric()、gluSphere()、gluCylinder()、gluDisk()、gluPartialDisk()、gluDeleteQuadric();
- 非均勻有理B樣條繪制工具:主要用來定義和繪制Nurbs曲線和曲面,包括gluNewNurbsRenderer()、 gluNurbsCurve()、gluBeginSurface()、gluEndSurface()、gluBeginCurve()、 gluNurbsProperty();
- 錯誤反饋工具:獲取出錯信息的字符串gluErrorString()。
3.OpenGL輔助庫
包含有31個函數(shù),函數(shù)名前綴為aux。這部分函數(shù)提供窗口管理、輸入輸出處理以及繪制一些簡單三維物體。此函數(shù)由glaux.dll來負責解釋執(zhí)行。 創(chuàng)建aux庫是為了學習和編寫OpenGL程序,它更像是一個用于測試創(chuàng)意的預備基礎接管。Aux庫在windows實現(xiàn)有很多錯誤,因此很容易導致頻繁 的崩潰。在跨平臺的編程實例和演示中,aux很大程度上已經(jīng)被glut庫取代。OpenGL中的輔助庫不能在所有的OpenGL平臺上運行。
輔助庫函數(shù)主要包括以下幾類:
- 窗口初始化和退出函數(shù):auxInitDisplayMode()和auxInitPosition();
- 窗口處理和時間輸入函數(shù):auxReshapeFunc()、auxKeyFunc()和auxMouseFunc();
- 顏色索引裝入函數(shù):auxSetOneColor();
- 三 維物體繪制函數(shù):包括了兩種形式網(wǎng)狀體和實心體,如繪制立方體auxWireCube()和 auxSolidCube()。這里以網(wǎng)狀體為例,長方體auxWireBox()、環(huán)形圓紋面auxWireTorus()、圓柱 auxWireCylinder()、二十面體auxWireIcosahedron()、八面體auxWireOctahedron()、四面體
auxWireTetrahedron()、十二面體auxWireDodecahedron()、圓錐體auxWireCone()和茶壺 auxWireTeapot();
- 背景過程管理函數(shù):auxIdleFunc();
- 程序運行函數(shù):auxMainLoop()。
4.OpenGL工具庫 OpenGL Utility Toolkit
包含大約30多個函數(shù),函數(shù)名前綴為glut。glut是不依賴于窗口平臺的OpenGL工具包,由Mark KLilgrad在SGI編寫(現(xiàn)在在Nvidia),目的是隱藏不同窗口平臺API的復雜度。 函數(shù)以glut開頭,它們作為aux庫功能更強的替代品,提供更為復雜的繪制功能,此函數(shù)由glut.dll來負責解釋執(zhí)行。由于glut中的窗口管理函 數(shù)是不依賴于運行環(huán)境的,因此OpenGL中的工具庫可以在X-Window, Windows NT, OS/2等系統(tǒng)下運行,特別適合于開發(fā)不需要復雜界面的OpenGL示例程序。對于有經(jīng)驗的程序員來說,一般先用glut理順3D圖形代碼,然后再集成為 完整的應用程序。
這部分函數(shù)主要包括:
- 窗口操作函數(shù):窗口初始化、窗口大小、窗口位置函數(shù)等[glutInit()、glutInitDisplayMode()、glutInitWindowSize()、glutInitWindowPosition()];
- 回調(diào)函數(shù):響應刷新消息、鍵盤消息、鼠標消息、定時器函數(shù)[GlutDisplayFunc()、glutPostRedisplay()、 glutReshapeFunc()、glutTimerFunc()、glutKeyboardFunc()、glutMouseFunc()];
- 創(chuàng)建復雜的三維物體:這些和aux庫的函數(shù)功能相同;
- 菜單函數(shù):創(chuàng)建添加菜單的函數(shù)GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu()和glutAttachMenu();
- 程序運行函數(shù):glutMainLoop()。
5.Windows專用庫
針對windows平臺的擴展,包含有16個函數(shù),函數(shù)名前綴為wgl。這部分函數(shù)主要用于連接OpenGL和Windows ,以彌補OpenGL在文本方面的不足。 Windows專用庫只能用于Windows環(huán)境中。
這類函數(shù)主要包括以下幾類:
- 繪圖上下文相關函數(shù):wglCreateContext()、wglDeleteContext()、wglGetCurrentContent()、wglGetCurrentDC()、wglDeleteContent();
- 文字和文本處理函數(shù):wglUseFontBitmaps()、wglUseFontOutlines();
- 覆蓋層、地層和主平面層處理函數(shù):wglCopyContext()、wglCreateLayerPlane()、wglDescribeLayerPlane()、wglReakizeLayerPlatte();
- 其他函數(shù):wglShareLists()、wglGetProcAddress()。
6.Win32 API函數(shù)庫
包含有6個函數(shù),函數(shù)名無專用前綴,是win32擴展函數(shù)。這部分函數(shù)主要用于處理像素存儲格式和雙幀緩存;這6個函數(shù)將替換Windows GDI中原有的同樣的函數(shù)。Win32API函數(shù)庫只能用于Windows 95/98/NT環(huán)境中。
7.X窗口專用庫
是針對Unix和Linux的擴展函數(shù)。包括渲染上下文、繪制圖元、顯示列表、紋理貼圖等;
- 初始化:glXQueryExtension();
- 渲染上下文函數(shù):glXCreateContext()、glXDestroyContext()、glXCopyContext()、glXMakeCurrent()、glXCreateGLXPixmap();
- 執(zhí)行:glXWaitGL()、glXWaitX();
- 緩沖區(qū)和字體:glXSwapBuffers()、glXUseXFont()。
8.其他擴展庫
這些函數(shù)可能是新的OpenGL函數(shù),并沒有在標準OpenGL庫中實現(xiàn),或者它們是用來擴展已存在的OpenGL函數(shù)的功能。和glu、glx和 wgl一樣,這些OpenGL擴展是由硬件廠商和廠商組織開發(fā)的。OpenGL擴展(OpenGL Extention)包含了大量的擴展API函數(shù)。
隨著硬件的更新,硬件廠商首先向SGI申請登記新的擴展,編寫規(guī)格說明書(specification)。然后按照說明書進行開發(fā)擴展程序。不同的 OpenGL實現(xiàn)(OpenGL Implementation)支持的擴展可能不一樣,只有隨著某一擴展的推廣與應用以及硬件技術的提高該擴展才會在所有的OpenGL實現(xiàn)中被給予支 持,從而最終成為OpenGL標準庫的一部分。擴展由SGI維護,在SGI網(wǎng)站上列出了目前公開的已注冊的擴展及其官方說明書。擴展源由擴展函數(shù)的后綴來
指明(或使用擴展常量后綴)。例如,后綴WIN表明一個符合Windows規(guī)范的擴展,EXT或ARB后綴表明該擴展由多個賣主定義。
下面給出OpenGL官方規(guī)定的命名規(guī)則:
- ARB – OpenGL
Architecture Review Board正式核準的擴展,往往由廠商開發(fā)的擴展發(fā)展而來,如果同時存在廠商開發(fā)的擴展和ARB擴展,應該優(yōu)先使用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公司開發(fā)的擴展;
- SGIX –
Silicon Graphics (experimental) 公司開發(fā)的實驗性擴展;
- SUN – Sun
Microsystems;
- WIN – Microsoft 。
由于OpenGL擴展在針對不同平臺和不同驅(qū)動,OpenGL不可能把所有的接口程序全部放到gl.h、glx.h、wgl.h中,而是將這些函數(shù)頭放在了glext.h、glxext.h和wglext.h中。這些擴展被看作時OpenGL核心庫規(guī)范的增加和修改。
posted on 2008-08-31 03:56
bneliao 閱讀(393)
評論(0) 編輯 收藏 引用 所屬分類:
graph/game