OpenGL是OpenGraphicsLib的縮寫,是一套三維圖形處理庫,也是該領域的工業標準。
電腦三維圖形是指將用資料描述的三維空間通過計算轉換成二維映像並顯示或列印出來的技術。
OpenGL就是支援這種轉換的程式庫,它源於SGI公司為其圖形工作站開發的IRIS GL,在跨平台移植過程中發展成為OpenGL。SGI在1992年7月發布1.0版,後成為工業標準,由成立於1992年的獨立財團OpenGL
Architecture Review Board (ARB)控制。SGI等ARB成員以投票方式產生標準,並製成規範文檔(Specification)公布,各軟硬體廠商據此開發自己系統上的實現。只有通過了ARB規範全部測試的實現才能稱為OpenGL。1995年12月ARB批准了1.1版本,最新版規範是1999.5通過的1.2.1。
OpenGL被設計成獨立於硬體,獨立於視窗系統的,在運行各種作業系統的各種電腦上都可用,並能在網路環境下以客戶/伺服器模式工作,是專業圖形處理、科學計算等高端應用領域的標準圖形庫。它低端應用上的主要競爭者是MS-Direct3D,該圖形庫是以COM介面形式提供的,所以極為較複雜,穩定性差,另外微軟公司擁有該庫著作權,目前只在Windows平台上可用。D3D的優勢在速度上,但現在低價顯卡都能提供很好的OpenGL硬體加速,所以做3D使用Direct3D已沒有特別的必要,在專業圖形處理特別是高端應用方面目前還沒有出現以Direct3D技術為基礎的例子,而遊戲等低端應用也有轉向OpenGL的趨勢。
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庫的函數功能相同。建立網狀體和實心體。如glutSolidSphere()、glutWireSphere()等。在此不再敘述。
菜單函數。建立添加菜單的函數GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu() 和glutAttachMenu()。
程式運行函數,glutMainLoop()。