OpenGL經常使用API程序員
開發基於OpenGL的應用程序,必須先了解OpenGL的庫函數。它採用C語言風格,提供大量的函數來進行圖形的處理和顯示。OpenGL庫函數的命名方式很是有規律。全部OpenGL函數採用瞭如下格式:編程
<庫前綴><根命令><可選的參數個數><可選的參數類型>windows
庫前綴有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的擴展機制開發的函數。下面逐一對這些庫進行詳細介紹。工具
核心庫包含有115個函數,函數名的前綴爲gl。這部分函數用於常規的、核心的圖形處理。此函數由gl.dll來負責解釋執行。因爲許多函數能夠接收不一樣數如下幾類。據類型的參數,所以派生出來的函數原形多達300多個。核心庫中的函數主要能夠分爲如下幾類函數:oop
表1學習
功能測試 |
函數字體 |
繪製基本幾何圖元 |
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()。 |
包含有43個函數,函數名的前綴爲glu。OpenGL提供了強大的可是爲數很少的繪圖命令,全部較複雜的繪圖都必須從點、線、面開始。Glu 爲了減輕繁重的編程工做,封裝了OpenGL函數,Glu函數經過調用核心庫的函數,爲開發者提供相對簡單的用法,實現一些較爲複雜的操做。此函數由glu.dll來負責解釋執行。OpenGL中的核心庫和實用庫能夠在全部的OpenGL平臺上運行。主要包括瞭如下幾種:
表2
功能 |
函數 |
輔助紋理貼圖 |
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()。 |
包含有31個函數,函數名前綴爲aux。這部分函數提供窗口管理、輸入輸出處理以及繪製一些簡單三維物體。此函數由glaux.dll來負責解釋執行。建立aux庫是爲了學習和編寫OpenGL程序,它更像是一個用於測試創意的預備基礎接管。Aux庫在windows實現有不少錯誤,所以很容易致使頻繁的崩潰。在跨平臺的編程實例和演示中,aux很大程度上已經被glut庫取代。OpenGL中的輔助庫不能在全部的OpenGL平臺上運行。
輔助庫函數主要包括如下幾類:
表3
功能 |
函數 |
窗口初始化和退出 |
auxInitDisplayMode()和auxInitPosition(); |
窗口處理和時間輸入 |
auxReshapeFunc()、auxKeyFunc()和auxMouseFunc(); |
顏色索引裝入函數 |
auxSetOneColor(); |
三維物體繪製函數 |
包括了兩種形式網狀體和實心體,如繪製立方體auxWireCube()和 auxSolidCube()。這裏以網狀體爲例,長方體auxWireBox()、環形圓紋面auxWireTorus()、圓柱auxWireCylinder()、二十面體auxWireIcosahedron()、八面體auxWireOctahedron()、四面體auxWireTetrahedron()、十二面體auxWireDodecahedron()、圓錐體auxWireCone()和茶壺auxWireTeapot(); |
背景過程管理 |
auxIdleFunc(); |
程序運行 |
auxMainLoop() |
包含大約30多個函數,函數名前綴爲glut。glut是不依賴於窗口平臺的OpenGL工具包,由Mark KLilgrad在SGI編寫(如今在Nvidia),目的是隱藏不一樣窗口平臺API的複雜度。 函數以glut開頭,它們做爲aux庫功能更強的替代品,提供更爲複雜的繪製功能,此函數由glut.dll來負責解釋執行。因爲glut中的窗口管理函數是不依賴於運行環境的,所以OpenGL中的工具庫能夠在X-Window, Windows NT, OS/2等系統下運行,特別適合於開發不須要複雜界面的OpenGL示例程序。對於有經驗的程序員來講,通常先用glut理順3D圖形代碼,而後再集成爲完整的應用程序。
這部分函數主要包括:
表4
功能 |
函數 |
窗口操做 |
窗口初始化、窗口大小、窗口位置函數等[glutInit()、glutInitDisplayMode()、glutInitWindowSize()、glutInitWindowPosition()]; |
回調 |
響應刷新消息、鍵盤消息、鼠標消息、定時器函數[GlutDisplayFunc()、glutPostRedisplay()、glutReshapeFunc()、glutTimerFunc()、glutKeyboardFunc()、glutMouseFunc()]; |
建立複雜的三維物體 |
這些和aux庫的函數功能相同; |
菜單函數 |
建立添加菜單的函數GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu()和glutAttachMenu(); |
程序運行函數 |
glutMainLoop() |
針對windows平臺的擴展,包含有16個函數,函數名前綴爲wgl。這部分函數主要用於鏈接OpenGL和Windows ,以彌補OpenGL在文本方面的不足。 Windows專用庫只能用於Windows環境中。
這類函數主要包括如下幾類:
表5
功能 |
函數 |
繪圖上下文相關 |
wglCreateContext()、wglDeleteContext()、wglGetCurrentContent()、wglGetCurrentDC()、wglDeleteContent(); |
文字和文本處理 |
wglUseFontBitmaps()、wglUseFontOutlines(); |
覆蓋層、地層和主平面層處理 |
wglCopyContext()、wglCreateLayerPlane()、wglDescribeLayerPlane()、wglReakizeLayerPlatte(); |
其餘 |
wglShareLists()、wglGetProcAddress()。 |
包含有6個函數,函數名無專用前綴,是win32擴展函數。這部分函數主要用於處理像素存儲格式和雙幀緩存;這6個函數將替換Windows GDI中原有的一樣的函數。Win32API函數庫只能用於Windows 95/98/NT環境中。
7.X窗口專用庫
是針對Unix和Linux的擴展函數。包括渲染上下文、繪製圖元、顯示列表、紋理貼圖等;
表7
功能 |
函數 |
初始化 |
glXQueryExtension(); |
渲染上下文 |
glXCreateContext()、glXDestroyContext()、glXCopyContext()、glXMakeCurrent()、glXCreateGLXPixmap(); |
執行 |
glXWaitGL()、glXWaitX(); |
緩衝區和字體 |
glXSwapBuffers()、glXUseXFont() |
這些函數多是新的OpenGL函數,並無在標準OpenGL庫中實現,或者它們是用來擴展已存在的OpenGL函數的功能。和glu、glx和wgl同樣,這些OpenGL擴展是由硬件廠商和廠商組織開發的。OpenGL擴展(OpenGL Extention)包含了大量的擴展API函數。
隨着硬件的更新,硬件廠商首先向SGI申請登記新的擴展,編寫規格說明書(specification)。而後按照說明書進行開發擴展程序。不一樣的OpenGL實現(OpenGLImplementation)支持的擴展可能不同,只有隨着某一擴展的推廣與應用以及硬件技術的提升該擴展才會在全部的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 OpenGLimplementation ;
· 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核心庫規範的增長和修改。
如有錯誤,請各大網友幫忙糾正下!