開發(fā)基于 OpenGL 的應(yīng)用程序,必須先了解 OpenGL 的庫函數(shù)。它采用 C 語言風(fēng)格,提供大量的函數(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ù)庫相關(guān)的 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ù)。下面逐一對這些庫進行詳細(xì)介紹。
1 . OpenGL 核心庫
核心庫包含有 115 個函數(shù),函數(shù)名的前綴為 gl 。這部分函數(shù)用于常規(guī)的、核心的圖形處理。此函數(shù)由 gl.dll 來負(fù)責(zé)解釋執(zhí)行。由于許多函數(shù)可以接收不同數(shù)以下幾類。據(jù)類型的參數(shù),因此派生出來的函數(shù)原形多達(dá) 300 多個。核心庫中的函數(shù)主要可以分為以下幾類函數(shù):
繪制基本幾何圖元的函數(shù): glBegain() 、 glEnd() 、 glNormal*() 、 glVertex*() ;
矩陣操作、幾何變換和投影變換的函數(shù):如矩陣入棧函數(shù) glPushMatrix() ,矩陣出棧函數(shù) glPopMatrix() ,裝載矩陣函數(shù) glLoadMatrix() ,矩陣相乘函數(shù) glMultMatrix() ,當(dāng)前矩陣函數(shù) glMatrixMode() 和矩陣標(biāo)準(zhǔn)化函數(shù) glLoadIdentity() ,幾何變換函數(shù) glTranslate*() 、 glRotate*() 和 glScale*() ,投影變換函數(shù) glOrtho() 、 glFrustum() 和視口變換函數(shù) glViewport() ;
顏色、光照和材質(zhì)的函數(shù):如設(shè)置顏色模式函數(shù) glColor*() 、 glIndex*() ,設(shè)置光照效果的函數(shù) glLight*() 、 glLightModel*() 和設(shè)置材質(zhì)效果函數(shù) glMaterial() ;
顯示列表函數(shù):主要有創(chuàng)建、結(jié)束、生成、刪除和調(diào)用顯示列表的函數(shù) glNewList() 、 glEndList() 、 glGenLists() 、 glCallList() 和 glDeleteLists() ;
紋理映射函數(shù):主要有一維紋理函數(shù) glTexImage1D() 、二維紋理函數(shù) glTexImage2D() 、設(shè)置紋理參數(shù)、紋理環(huán)境和紋理坐標(biāo)的函數(shù) glTexParameter*() 、 glTexEnv*() 和 glTetCoord*() ;
特殊效果函數(shù):融合函數(shù) glBlendFunc() 、反走樣函數(shù) glHint() 和霧化效果 glFog*() ;
光柵化、象素操作函數(shù):如象素位置 glRasterPos*() 、線型寬度 glLineWidth() 、多邊形繪制模式 glPolygonMode() ,讀取象素 glReadPixel() 、復(fù)制象素 glCopyPixel() ;
選擇與反饋函數(shù):主要有渲染模式 glRenderMode() 、選擇緩沖區(qū) glSelectBuffer() 和反饋緩沖區(qū) glFeedbackBuffer() ;
曲線與曲面的繪制函數(shù):生成曲線或曲面的函數(shù) glMap*() 、 glMapGrid*() ,求值器的函數(shù) glEvalCoord*() glEvalMesh*() ;
狀態(tài)設(shè)置與查詢函數(shù): glGet*() 、 glEnable() 、 glGetError() 。
2 . OpenGL 實用庫 The OpenGL Utility Library (GLU)
包含有 43 個函數(shù),函數(shù)名的前綴為 glu 。 OpenGL 提供了強大的但是為數(shù)不多的繪圖命令,所有較復(fù)雜的繪圖都必須從點、線、面開始。 Glu 為了減輕繁重的編程工作,封裝了 OpenGL 函數(shù), Glu 函數(shù)通過調(diào)用核心庫的函數(shù),為開發(fā)者提供相對簡單的用法,實現(xiàn)一些較為復(fù)雜的操作。此函數(shù)由 glu.dll 來負(fù)責(zé)解釋執(zhí)行。 OpenGL 中的核心庫和實用庫可以在所有的 OpenGL 平臺上運行。主要包括了以下幾種:
輔助紋理貼圖函數(shù): gluScaleImage() 、 gluBuild1Dmipmaps() 、 gluBuild2Dmipmaps() ;
坐標(biāo)轉(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 來負(fù)責(zé)解釋執(zhí)行。創(chuàng)建 aux 庫是為了學(xué)習(xí)和編寫 OpenGL 程序,它更像是一個用于測試創(chuàng)意的預(yù)備基礎(chǔ)接管。 Aux 庫在 windows 實現(xiàn)有很多錯誤,因此很容易導(dǎo)致頻繁的崩潰。在跨平臺的編程實例和演示中, 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 的復(fù)雜度。 函數(shù)以 glut 開頭,它們作為 aux 庫功能更強的替代品,提供更為復(fù)雜的繪制功能,此函數(shù)由 glut.dll 來負(fù)責(zé)解釋執(zhí)行。由于 glut 中的窗口管理函數(shù)是不依賴于運行環(huán)境的,因此 OpenGL 中的工具庫可以在 X-Window, Windows NT, OS/2 等系統(tǒng)下運行,特別適合于開發(fā)不需要復(fù)雜界面的 OpenGL 示例程序。對于有經(jīng)驗的程序員來說,一般先用 glut 理順 3D 圖形代碼,然后再集成為完整的應(yīng)用程序。
這部分函數(shù)主要包括:
窗口操作函數(shù):窗口初始化、窗口大小、窗口位置函數(shù)等 [glutInit() 、 glutInitDisplayMode() 、 glutInitWindowSize() 、 glutInitWindowPosition()] ;
回調(diào)函數(shù):響應(yīng)刷新消息、鍵盤消息、鼠標(biāo)消息、定時器函數(shù) [GlutDisplayFunc() 、 glutPostRedisplay() 、 glutReshapeFunc() 、 glutTimerFunc() 、 glutKeyboardFunc() 、 glutMouseFunc()] ;
創(chuàng)建復(fù)雜的三維物體:這些和 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ù)主要包括以下幾類:
繪圖上下文相關(guān)函數(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ù),并沒有在標(biāo)準(zhǔn) OpenGL 庫中實現(xiàn),或者它們是用來擴展已存在的OpenGL 函數(shù)的功能。和 glu 、 glx 和 wgl 一樣,這些 OpenGL 擴展是由硬件廠商和廠商組織開發(fā)的。OpenGL 擴展 (OpenGL Extention) 包含了大量的擴展 API 函數(shù)。
隨著硬件的更新,硬件廠商首先向 SGI 申請登記新的擴展,編寫規(guī)格說明書( specification )。然后按照說明書進行開發(fā)擴展程序。不同的 OpenGL 實現(xiàn)( OpenGL Implementation )支持的擴展可能不一樣,只有隨著某一擴展的推廣與應(yīng)用以及硬件技術(shù)的提高該擴展才會在所有的 OpenGL 實現(xiàn)中被給予支持,從而最終成為 OpenGL 標(biāo)準(zhǔn)庫的一部分。擴展由 SGI 維護,在 SGI 網(wǎng)站上列出了目前公開的已注冊的擴展及其官方說明書。擴展源由擴展函數(shù)的后綴來指明 ( 或使用擴展常量后綴 ) 。例如,后綴 WIN 表明一個符合 Windows 規(guī)范的擴展, EXT 或 ARB 后綴表明該擴展由多個賣主定義。
下面給出 OpenGL 官方規(guī)定的命名規(guī)則:
ARB – OpenGL Architecture Review Board 正式核準(zhǔn)的擴展,往往由廠商開發(fā)的擴展發(fā)展而來,如果同時存在廠商開發(fā)的擴展和 ARB 擴展,應(yīng)該優(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ī)范的增加和修改。