OpenGL API

開發基于 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 中的工具庫可以在 XWindow,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 擴展(OpenGLExtention)包含了大量的擴展 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 核心庫規范的增加和修改。

9.OpenGl 核心函數庫

glAccum操作累加緩沖區

glAddSwapHintRectWIN定義一組被 SwapBuffers 拷貝的三角形

glAlphaFunc允許設置 alpha 檢測功能

glAreTexturesResident決定特定的紋理對象是否常駐在紋理內存中

glArrayElement定義一個被用于頂點渲染的數組成分

glBegin、glEnd定義一個或一組原始的頂點

glBindTexture允許建立一個綁定到目標紋理的有名稱的紋理

glBitmap繪制一個位圖

glBlendFunc特殊的像素算法

glCallList執行一個顯示列表

glCallLists執行一列顯示列表

glClear用當前值清除緩沖區

GlClearAccum為累加緩沖區指定用于清除的值

glClearColor為色彩緩沖區指定用于清除的值

glClearDepth為深度緩沖區指定用于清除的值

glClearStencil為模板緩沖區指定用于清除的值

glClipPlane定義被裁剪的一個平面幾何體

glColor設置當前色彩

glColorMask允許或不允許寫色彩組件幀緩沖區

glColorMaterial使一個材質色彩指向當前的色彩

glColorPointer定義一列色彩

glColorTableEXT定義目的一個調色板紋理的調色板的格式和尺寸

glColorSubTableEXT定義目的紋理的調色板的一部分被替換

glCopyPixels拷貝幀緩沖區里的像素

glCopyTexImage1D將像素從幀緩沖區拷貝到一個單空間紋理圖象中

glCopyTexImage2D將像素從幀緩沖區拷貝到一個雙空間紋理圖象中

glCopyTexSubImage1D從幀緩沖區拷貝一個單空間紋理的子圖象

glCopyTexSubImage2D從幀緩沖區拷貝一個雙空間紋理的子圖象

glCullFace定義前面或后面是否能被精選

glDeleteLists刪除相鄰一組顯示列表

glDeleteTextures刪除命名的紋理

glDepthFunc定義用于深度緩沖區對照的數據

glDepthMask允許或不允許寫入深度緩沖區

glDepthRange定義 z 值從標準的設備坐標映射到窗口坐標

glDrawArrays定義渲染多個圖元

glDrawBuffer定義選擇哪個色彩緩沖區被繪制

glDrawElements渲染數組數據中的圖元

glDrawPixels將一組像素寫入幀緩沖區

glEdgeFlag定義一個邊緣標志數組

glEdgeFlagPointer定義一個邊緣標志數組

glEnable、glDisable打開或關閉 OpenGL 的特殊功能

glEnableClientState、glDisableClientState分別打開或關閉數組

glEvalCoord求解一維和二維貼圖

glEvalMesh1、glEvalMesh2求解一維和二維點或線的網格

glEvalPoint1、glEvalPoint2生成及求解一個網格中的單點

glFeedbackBuffer控制反饋模式

glFinish等待直到 OpenGL 執行結束

glFlush在有限的時間里強制 OpenGL 的執行

glFogf、glFogi、glFogfv、glFogiv定義霧參數

glFrontFace定義多邊形的前面和背面

glFrustum當前矩陣乘上透視矩陣

glGenLists生成一組空的連續的顯示列表

glGenTextures生成紋理名稱

glGetBooleanv、glGetDoublev、glGetFloatv、glGetIntegerv返回值或所選參數值

glGetClipPlane返回特定裁減面的系數

glGetColorTableEXT從當前目標紋理調色板得到顏色表數據

glGetColorTableParameterfvEXT、glGetColorTableParameterivEXT從顏色表中得到調色板參數

glGetError返回錯誤消息

glGetLightfv、glGetLightiv返回光源參數值

glGetMapdv、glGetMapfv、glGetMapiv返回求值程序參數

glGetMaterialfv、glGetMaterialiv返回材質參數

glGetPixelMapfv、glGetpixelMapuiv、glGetpixelMapusv返回特定的像素圖

glGetPointerv返回頂點數據數組的地址

glGetPolygonStipple返回多邊形的點圖案

glGetString返回描述當前 OpenGl 連接的字符串

glGetTexEnvfv返回紋理環境參數

glGetTexGendv、glGetTexGenfv、glGetTexGeniv返回紋理坐標生成參數

glGetTexImage返回一個紋理圖象

glGetTexLevelParameterfv、glGetTexLevelParameteriv返回特定的紋理參數的細節級別

glGetTexParameterfv、glGetTexParameteriv返回紋理參數值

glHint定義實現特殊的線索

glIndex建立當前的色彩索引

glIndexMask控制寫色彩索引緩沖區里的單獨位

GlIndexPointer定義一個顏色索引數組

glInitName初始化名字堆棧

glInterleavedArrays同時定義和允許幾個在一個大的數組集合里的交替數組

glIsEnabled定義性能是否被允許

glIsList檢測顯示列表的存在

glIsTexture確定一個名字對應一個紋理

glLightf、glLighti、glLightfv、glLightiv設置光源參數

glLightModelf、glLightModeli、glLightModelfv、glLightModeliv設置光線模型參數

glLineStipple設定線點繪圖案

glLineWidth設定光柵線段的寬

glListBase為 glcallList 設定顯示列表的基礎

glLoadIdentity用恒等矩陣替換當前矩陣

glLoadMatrixd,glLoadMatrif用一個任意矩陣替換當前矩陣

glLoadName將一個名字調入名字堆棧

glLogicOp為色彩索引渲染定義一個邏輯像素操作

glMap1d,glMap1f定義一個一維求值程序

glMap2d,glMap2f定義一個二維求值程序

glMapGrid1d,glMapGrid1f,glMapgrid2d,glMapGrid2f定義一個一維或二維網格

glMaterialf,glMateriali,glMateriafv,glMaterialiv為光照模型定義材質參數

glMatrixMode定義哪一個矩陣是當前矩陣

glMultMatrixd,glMultMatrixf用當前矩陣與任意矩陣相乘

glNewList,glEndList創建或替換一個顯示列表

glNormal設定當前頂點法向

glNormalPointer設定一個法向數組

glOrtho用垂直矩陣與當前矩陣相乘

glPassThrough在反饋緩沖區做記號

glPixelMapfv,glPixelMapuiv,glPixelMapusv設定像素交換圖

glPixelStoref,glpixelStorei設定像素存儲模式

glPixelTransferf,glPixelTransferi設定像素存儲模式

glPixelZoom設定像素縮放因數

glPointSize設定光柵點的直徑

glPolygonMode選擇一個多邊形的光柵模式

glPolygonOffset設定 OpenGL 用于計算深度值的比例和單元

glPolygonStipple設定多邊形填充圖案

glPrioritizeTextures設定紋理固定的優先級

glPushAttrib,glPopAttrib屬性堆棧的壓入和彈出操作

glPushClientAttrib,glPopClientAttrib在客戶屬性堆棧存儲和恢復客戶狀態值

glPushmatrix,glPopMatrix矩陣堆棧的壓入和彈出操作

glPushName,glPopName名字堆棧的壓入和彈出操作

glRasterPos定義像素操作的光柵位置

glreadBuffer為像素選擇一個源色彩緩沖區

glReadPixels從幀緩沖區讀取一組數據

glRectd,glRectf,glRecti,glRects,glRectdv,glRectfv,glRectiv,glRectsv繪制一個三角形

glRenderMode定義光柵模式

glRotated,glRotatef將旋轉矩陣與當前矩陣相乘

glScaled,glScalef將一般的比例矩陣與當前矩陣相乘

glScissor定義裁減框

glSelectBuffer為選擇模式值建立一個緩沖區

glShadeModel選擇平直或平滑著色

glStencilFunc為模板測試設置功能和參照值

glStencilMask控制在模板面寫單獨的位

glStencilOp設置激活模式測試

glTexCoord設置當前紋理坐標

glTexCoordPointer定義一個紋理坐標數組

glTexEnvf,glTexEnvi,glTexEnvfv,glTexEnviv設定紋理坐標環境參數

glTexGend,glTexgenf,glTexGendv,glTexGenfv,glTexGeniv控制紋理坐標的生成

glTexImage1D定義一個一維的紋理圖象

glTexImage2D定義一個二維的紋理圖

glTexParameterf,glTexParameteri,glTexParameterfv,glTexParameteriv設置紋理參數

glTexSubImage1D定義一個存在的一維紋理圖像的一部分,但不能定義新的紋理

glTexSubImage2D定義一個存在的二維紋理圖像的一部分,但不能定義新的紋理

glTranslated,glTranslatef將變換矩陣與當前矩陣相乘

glVertex定義一個頂點

glVertexPointer設定一個頂點數據數組

glViewport設置視窗

10 . OpenGL 應用函數庫

gluBeginCurve,gluEndCurve定義一條不一至的有理的 NURBS 曲線

gluBeginPolygon,gluEndPolygon定義一個非凸多邊形

gluBeginSurface,gluEndSurface定義一個 NURBS 曲線

gluBeginTrim,gluEndTrim定義一個 NURBS 整理循環

gluBuild1Dmipmaps建立一維多重映射

gluBuild2Dmipmaps建立二維多重映射

gluCylinder繪制一個圓柱

gluDeleteNurbsRenderer刪除一個 NURBS 對象

gluDeleQuadric刪除一個二次曲面對象

gluDeleteTess刪除一個鑲嵌對象

gluDisk繪制一個盤子

gluErrorString根據 OpenGL 或 GLU 錯誤代碼產生錯誤字符串

gluGetNutbsProperty得到一個 NURBS 屬性

gluGetString得到一個描述 GLU 版本號或支持 GLU 擴展調用的字符串

gluGetTessProperty得到一個鑲嵌對象

gluLoadSamplingMatrices加載 NUMRBS 例子和精選矩陣

gluLookAt設定一個變換視點

gluNewNurbsRenderer創建一個 NURBS 對象

gluNewQuadric建立一個二次曲面對象

gluNewTess建立一個鑲嵌對象

gluNextContour為其他輪廓的開始做標記

gluNurbsCallback為 NURBS 對象設定一個回調

gluNnrbsCurve設定一個 NuRBS 曲線的形狀

gluNurbsProperty設定一個 NURBS 屬性

gluNurbsSurface定義一個 NURBS 表面的形狀

gluOrtho2D定義一個二位正交投影矩陣

gluPartialDisk繪制一個盤子的弧

gluPerspective設置一個透視投影矩陣

gluPickMatrix定義一個拾取區間

gluProject將對象坐標映射為窗口坐標

gluPwlCurve描述一個分段線性 NURBS 修剪曲線

gluQuadricCallback為二次曲面對象定義一個回調

gluQuadricDrawStyle為二次曲面設定合適的繪制風格

gluQuadricNormals定義二次曲面所用的法向的種類

gluQuadricOrientation定義二次曲面內部或外部方向

gluQuadricTexture定義是否帶二次其面做紋理帖圖

gluScaleImage將圖象變換為任意尺寸

gluSphere繪制一個球體

gluTessBeginContour,gluTessEndContour劃定一個邊界描述

gluTessBeginPolygon,gluTessEndPolygon劃定一個多邊形描述

gluTessCallback為鑲嵌對象定義一個回調

gluTessNormal為一個多邊行形定義法向

gluTessProperty設置鑲嵌對象的屬性

gluTessVertex定義在一個多邊形上的頂點

gluUnProject將窗口坐標映射為對象坐標

文/difcareer(簡書作者)

原文鏈接:http://www.lxweimin.com/p/8d30ae82c4dd

著作權歸作者所有,轉載請聯系作者獲得授權,并標注“簡書作者”。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容