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

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