天天看點

OpenGL開發庫的介紹[轉載]

 開發基于 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 中的工具庫可以在 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 核心庫規範的增加和修改。

繼續閱讀