OpenGL函式命名的方法都會遵守特定的規則,你可以由函式的名稱得知它是屬於那一個函式庫,以及使用的參數形態和數量,譬如 glVertex3fv()函式,字首gl表示屬於GL函式庫,Vertex表示函式的功能,而3是指有三個參數,f說明資料型態為浮點數,資料型態的視 別字請參見下面。最後的v字表示參數以陣列的方式傳入,如果沒有v這個視別字,參數則以單一變數的方式傳入。
OpenGL定義自己的資料型態,這是為了要讓OpenGL程式容易移植。每一個資料型態都可以找到ANSI C相對應的資料型態,當然你也可以直接使用C的資料型態,而不使用OpenGL所定義。表格中的視別字是作為函式的資料型態視別使用,由這個視別字可以判 別傳入參數的資料型態。
OpenGL資料型態定義 視別字 資料型態 C的資料型態
GLbyte b 8-bit integer signed char
GLshort s 16-bit integer short
GLint, GLsizei i 32-bit integer long
GLfloat, GLclampf f 32-bit floating-point float
GLdouble, GLclampd d 64-bit floating-point double
GLubyte, GLboolean ub 8-bit unsigned integer unsigned char
GLushort us 16-bit unsigned integer unsigned short
GLuint, GLenum, GLbitfield ui 32-bit unsigned integer unsigned long
OpenGL的資料型態都以GL為字首,後面所接的大多是它們相對應的C資料型態,例如GLshort對映C的short資料型態,GL字首後面如果接u表示unsigned資料型態,如GLubyte則表示unsigned byte。
OpenGL庫函數的命名規律
瞭解了OpenGL的資料類型,讓我們再回過頭來看看OpenGL庫函數的命名規律。所有OpenGL函數採用了以下格式:
<庫首碼><根命令><可選的參數個數><可選的參數類型>
庫首碼有gl、glu、aux、glut、wgl、glx等等,分別表示該函數屬於OpenGL某開發庫等,從函數名後面中還可以看出需要多少個參數以及參數的類型。I代表int型,f代表float型,d代表double型,u代表無符號整型。注意,有的函數參數類型尾碼前帶有數位2、3、4。2代表二維,3代表三維,4代表Alpha值(以後介紹)。有些OpenGL函數最後帶一個字母v,表示函數參數可用一個指標指向一個向量(或陣列)來替代一系列單個參數值。下面兩種格式都表示設置使用中色彩為紅色,二者等價。
glColor3f(1.0,0.0,0.0);等價于:
float color_array[]={1.0,0.0,0.0};
glColor3fv(color_array);
除了以上基本命名方式外,還有一種帶"*"星號的表示方法,例如glColor*(),它表示可以用函數的各種方式來設置使用中色彩。同理,glVertex*v()表示用一個指標指向所有類型的向量來定義一系列頂點座標值。
以下是OPENGL函式程式庫介紹
1.OpenGL核心庫
核心庫包含有115個函數,函數名的首碼為gl。
這部分函數用於常規的、核心的圖形處理。此函數由gl.dll來負責解釋執行。由於許多函數可以接收不同數以下幾類。據類型的參數,因此派生出來的函數原形多達300多個。
核心庫中的函數主要可以分為以下幾類函數:
(1)繪製基本幾何圖元的函數。如繪製圖元的函數glBegain()、glEnd()、glNormal*()、glVertex*()。
(2)矩陣操作、幾何變換和投影變換的函數。如
矩陣入棧函數glPushMatrix()、矩陣出棧函數glPopMatrix()、裝載矩陣函數glLoadMatrix()、矩陣相乘函數
glMultMatrix(),當前矩陣函數
glMatrixMode()和矩陣標準化函數glLoadIdentity(),幾何變換函數glTranslate*()、glRotate*()和
glScale*(),投影變換函數glOrtho()、glFrustum()和視口變換函數glViewport()等等。
操作範例
glLoadMatrixf(A) stack = [A]
glPushMatrix() stack = [A, A]
glMultMatrixf(B) stack = [BA, A]
glPopMatrix() stack = [A]
glMultMatrixf(B) stack = [AB, A]
其他例子
Example 1:
Example 2:
操作範例
glLoadMatrixf(A) stack = [A]
glPushMatrix() stack = [A, A]
glMultMatrixf(B) stack = [BA, A]
glPopMatrix() stack = [A]
glMultMatrixf(B) stack = [AB, A]
其他例子
Example 1:
command result glLoadMatrixf(A) stack = [A] glPushMatrix() stack = [A, A] glLoadMatrixf(B) stack = [B, A] glPopMatrix() stack = [A]
Example 2:
command result glLoadMatrixf(A) stack = [A] glPushMatrix() stack = [A, A] glMultMatrixf(B) stack = [AB, A] glPopMatrix() stack = [A]
(3)顏色、光照和材質的函數。如設置顏色模式函數glColor*()、glIndex*(),設置光照效果的函數glLight*() 、glLightModel*()和設置材質效果函數glMaterial()等等。
(4)顯示清單函數、主要有創建、結束、生成、刪除和調用顯示清單的函數glNewList()、 glEndList()、glGenLists()、glCallList()和glDeleteLists()。
(5)紋理映射函數,主要有一維紋理函數glTexImage1D()、二維紋理函數glTexImage2D()、 設置紋理參數、紋理環境和紋理座標的函數glTexParameter*()、glTexEnv*()和glTetCoord*()等。
(6)特殊效果函數。融合函數glBlendFunc()、反走樣函數glHint()和霧化效果glFog*()。
(7)點陣化、象素操作函數。如象素位置glRasterPos*()、線型寬度glLineWidth()、多邊形繪製模式glPolygonMode(),讀取象素glReadPixel()、複製象素glCopyPixel()等。
(8)選擇與回饋函數。主要有渲染模式glRenderMode()、選擇緩衝區glSelectBuffer()和回饋緩衝區glFeedbackBuffer()等。
(9)曲線與曲面的繪製函數。生成曲線或曲面的函數glMap*()、glMapGrid*(),求值器的函數glEvalCoord*() glEvalMesh*()。
(10)狀態設置與查詢函數。主要有glGet*()、glEnable()、glGetError()等。
2.OpenGL實用庫The OpenGL Utility Library (GLU)
包含有43個函數,函數名的首碼為glu。
OpenGL提供了強大的但是為數不多的繪圖命令,所有較複雜的繪圖都必須從點。線、面開始。Glu 為了減輕繁重的程式設計工作,封裝了OpenGL函數,Glu函數通過調用核心庫的函數,為開發者提供相對簡單的用法,實現一些較為複雜的操作。此函數由 glu.dll來負責解釋執行。OpenGL中的核心庫和實用庫可以在所有的OpenGL平臺上運行。
主要包括了以下幾種:
(1)輔助紋理貼圖函數,有gluScaleImage() 、gluBuild1Dmipmaps()、gluBuild2Dmipmaps()。
(2)座標轉換和投影變換函數,定義投影方式函數
gluPerspective()、gluOrtho2D()
、gluLookAt(),拾取投影視景體函數gluPickMatrix(),投影矩陣計算gluProject()和
gluUnProject()等等。
(3)多邊形鑲嵌工具,有gluNewTess()、
gluDeleteTess()、gluTessCallback()、gluBeginPolygon()
gluTessVertex()、gluNextContour()、gluEndPolygon()等等。
(4)二次曲面繪製工具,主要有繪製球面、錐面、柱面、圓環面gluNewQuadric()、gluSphere()、gluCylinder()、gluDisk()、gluPartialDisk()、gluDeleteQuadric()等等。
(5)非均勻有理B樣條繪製工具,主要用來定義和繪製Nurbs曲線和曲
面,包括gluNewNurbsRenderer()、
gluNurbsCurve()、gluBeginSurface()、gluEndSurface()、gluBeginCurve()、
gluNurbsProperty()等函數。
(6)錯誤回饋工具,獲取出錯資訊的字串gluErrorString()。
3.OpenGL輔助庫
包含有31個函數,函數名首碼為aux。
這部分函數提供視窗管理、輸入輸出處理以及繪製一些簡單三維物體。此函數由glaux.dll來負責解釋執行。創建aux庫是為了學習和編寫 OpenGL程式,它更像是一個用於測試創意的預備基礎接管。Aux庫在windows實現有很多錯誤,因此很容易導致頻繁的崩潰。在跨平臺的程式設計實例和演示中,aux很大程度上已經被glut庫取代。OpenGL中的輔助庫不能在所有的OpenGL平臺上運行。
輔助庫函數主要包括以下幾類:
(1)視窗初始化和退出函數,auxInitDisplayMode()和auxInitPosition()。
(2)視窗處理和時間輸入函數,auxReshapeFunc()、auxKeyFunc()和auxMouseFunc()。
(3)色彩索引裝入函數,auxSetOneColor()。
(4)三維物體繪製函數。包括了兩種形式網狀體和實心體,如繪製立方體auxWireCube()和 auxSolidCube()。這
裡以網狀體為例,長方體auxWireBox()、環形圓紋面auxWireTorus()、圓柱
auxWireCylinder()、二十面體auxWireIcosahedron()、八面體auxWireOctahedron()、四面體
auxWireTetrahedron()、十二面體auxWireDodecahedron()、圓錐體auxWireCone()和茶壺 auxWireTeapot()。
(5)背景過程管理函數auxIdleFunc()。
(6)程式運行函數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圖形代碼,然後再集成為完整的應用程式。
這部分函數主要包括:
(1)視窗操作函數,視窗初始化、視窗大小、視窗位置等函數glutInit() glutInitDisplayMode() glutInitWindowSize() glutInitWindowPosition()等。
(2)回呼函數。回
應刷新消息、鍵盤消息、滑鼠消息、計時器函數等,GlutDisplayFunc() glutPostRedisplay()
glutReshapeFunc() glutTimerFunc() glutKeyboardFunc() glutMouseFunc()。
(3)創建複雜的三維物體。這些和aux庫的函數功能相同。創建網狀體和實心體。如glutSolidSphere()、glutWireSphere()等。在此不再敘述。
(4)功能表函數。創建添加功能表的函數GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu() 和glutAttachMenu()。
(5)程式運行函數,glutMainLoop()。
(一)庫函數
開發基於OpenGL的應用程式,必須先瞭解OpenGL的庫函數。它採用C語言風格,提供大量的函數來進行圖形的處理和顯示。OpenGL圖形庫一共有100多個函數,它們分別屬於OpenGL的基本庫、實用庫、輔助庫等不同的庫。
1、核心庫,包含的函數有115個,它們是最基本的函數,其首碼是gl;這部分函數用於常規的、核心的圖形處理,由gl.dll來負責解釋執行。核心庫中的函數可以進一步分為以下幾類函數。
(1)繪製基本幾何圖元的函數。
glBegain()、glEnd()、glNormal*()、glVertex*()。
(2)矩陣操作、幾何變換和投影變換的函數。
矩陣入棧函數glPushMatrix(),矩
陣出棧函數glPopMatrix(),裝載矩陣函數glLoadMatrix(),矩陣相乘函數glMultMatrix(),當前矩陣函數
glMatrixMode()和矩陣標準化函數glLoadIdentity(),幾何變換函數glTranslate*()、glRotate*()和glScale*(),投影變換函數glOrtho()、glFrustum()和視口變換函數glViewport()等等。
(3)顏色、光照和材質的函數。
如設置顏色模式函數glColor*()、glIndex*(),設置光照效果的函數glLight*() 、glLightModel*()和設置材質效果函數glMaterial()等等。
(4)顯示清單函數。
主要有創建、結束、生成、刪除和調用顯示清單的函數glNewList()、 glEndList()、glGenLists()、glCallList()和glDeleteLists()等。
(5)紋理映射函數。
主要有一維紋理函數glTexImage1D()、二維紋理函數glTexImage2D()、 設置紋理參數、紋理環境和紋理座標的函數glTexParameter*()、glTexEnv*()和glTetCoord*()等。
(6)特殊效果函數。
融合函數glBlendFunc()、反走樣函數glHint()和霧化效果glFog*()。
void glHint(GLenum target, GLenum hint); // 控制OpenGL的某些行为
参数target是要控制的行为
参数hint可以是GL_FASTEST, GL_NICEST, GL_DONT_CARE.(效率最高, 质量最好, 没有选择)
接受GL_FASTEST(即给出最有效的選擇)、GL_NICEST(即给出最高質量的選擇)、GL_DONT_CARE(即沒有選擇)等常量。
参数target的取值及其含义:
GL_POINT_SMOOTH_HINT, GL_LINE_SMOOTH_HINT, GL_POLYGON_SMOOTH_HINT----反走样操作中, 直线,点或多边形的采样质量.
GL_FOG_HINT----对每个像素(GL_NICEST)还是每个顶点(GL_FASTEST)执行雾效计算.
GL_PERSPECTIV_CORRECTION_HINT----颜色和纹理坐标插值的质量
GL_GENERATE_MIPMAP_HINT----自动生成的mipmap的质量和性能,在OPENGLES中好像只有此參數可用。
GL_TEXTURE_COMPRESSION_HINT----纹理图案的压缩质量和性能.
OPENGLES中可用的設定,其它參數不能用
void glHint(GLenum target, GLenum hint); // 控制OpenGL的某些行为
参数target是要控制的行为
参数hint可以是GL_FASTEST, GL_NICEST, GL_DONT_CARE.(效率最高, 质量最好, 没有选择)
接受GL_FASTEST(即给出最有效的選擇)、GL_NICEST(即给出最高質量的選擇)、GL_DONT_CARE(即沒有選擇)等常量。
参数target的取值及其含义:
GL_POINT_SMOOTH_HINT, GL_LINE_SMOOTH_HINT, GL_POLYGON_SMOOTH_HINT----反走样操作中, 直线,点或多边形的采样质量.
GL_FOG_HINT----对每个像素(GL_NICEST)还是每个顶点(GL_FASTEST)执行雾效计算.
GL_PERSPECTIV_CORRECTION_HINT----颜色和纹理坐标插值的质量
GL_GENERATE_MIPMAP_HINT----自动生成的mipmap的质量和性能,在OPENGLES中好像只有此參數可用。
GL_TEXTURE_COMPRESSION_HINT----纹理图案的压缩质量和性能.
OPENGLES中可用的設定,其它參數不能用
glHint(GL_GENERATE_MIPMAP_HINT, GL_FASTEST);
glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
glHint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE); // this is the default
(7)點陣化、象素操作函數。
圖元位置glRasterPos*()、線型寬度glLineWidth()、多邊形繪製模式glPolygonMode(),讀取象素glReadPixel()、複製象素glCopyPixel()等。
(8)選擇與回饋函數。
主要有渲染模式glRenderMode()、選擇緩衝區glSelectBuffer()和回饋緩衝區glFeedbackBuffer()等。
(9)曲線與曲面的繪製函數。
生成曲線或曲面的函數glMap*()、glMapGrid*(),求值器的函數glEvalCoord*() glEvalMesh*()。
(10)狀態設置與查詢函數。主要有glGet*()、glEnable()、glGetError()等。
2、實用庫(OpenGL utility library,GLU),包含的函數功能更高一些,如繪製複雜的曲線曲面、高級座標變換、多邊形分割等,共有43個,首碼為glu。Glu函數通過調用核心庫的函數,為開發者提供相對簡單的用法,實現一些較為複雜的操作。此類函數由glu.dll來負責解釋執行。主要包括了以下幾種:
(1)輔助紋理貼圖函數。
有gluScaleImage() 、gluBuild1Dmipmaps()、gluBuild2Dmipmaps()等。
(2)座標轉換和投影變換函數。
定義投影方式函數gluPerspective()、gluOrtho2D() 、gluLookAt(),拾取投影視景體函數gluPickMatrix(),投影矩陣計算gluProject()和 gluUnProject()等。
(3)多邊形鑲嵌工具。
有gluNewTess()、 gluDeleteTess()、gluTessCallback()、gluBeginPolygon() gluTessVertex()、gluNextContour()、gluEndPolygon()等。
(4)二次曲面繪製工具。
主要有繪製球面、錐面、柱面、圓環面gluNewQuadric()、gluSphere()、gluCylinder()、gluDisk()、gluPartialDisk()、gluDeleteQuadric()等等。
(5)非均勻有理B樣條繪製工具。
主要用來定義和繪製Nurbs曲線和曲面,包括
gluNewNurbsRenderer()、gluNurbsCurve()、gluBeginSurface()、gluEndSurface()、
gluBeginCurve()、gluNurbsProperty()等函數。
(6)錯誤回饋工具。
獲取出錯資訊的字串gluErrorString()等。
3、OpenGL輔助庫(OpenGL auxiliarylibrary,GLAUX),包括簡單的視窗管理、輸入事件處理、某些複雜三維物體繪製等函數,共有31個,首碼為aux。此類函數由glaux.dll來負責解釋執行。輔助庫函數主要包括以下幾類。
(1)視窗初始化和退出函數。
auxInitDisplayMode()和auxInitPosition()。
(2)視窗處理和時間輸入函數。
auxReshapeFunc()、auxKeyFunc()和auxMouseFunc()。
(3)色彩索引裝入函數。
auxSetOneColor()。
(4)三維物體繪製函數。
包括了兩種形式網狀體和實心體,如繪製立方體auxWireCube()和 auxSolidCube()。這
裡以網狀體為例,長方體auxWireBox()、環形圓紋面auxWireTorus()、圓柱auxWireCylinder()、二十面體
auxWireIcosahedron()、八面體auxWireOctahedron()、四面體auxWireTetrahedron()、十二面體
auxWireDodecahedron()、圓錐體auxWireCone()和茶壺auxWireTeapot()。繪製實心體只要將上述函數中的確"Wire"更換成"Solid"就可以了。
(5)其他。
背景過程管理函數auxIdleFunc();程式運行函數auxMainLoop()。
4、OpenGL工具庫(penGL Utility Toolkit)
包含大約30多個函數,函數名首碼為glut,此函數由glut.dll來負責解釋執行。這部分函數主要包括:
(1)視窗操作函數
視窗初始化、視窗大小、視窗位置等函數glutInit() glutInitDisplayMode()、glutInitWindowSize() glutInitWindowPosition()等。
(2)回呼函數。
回應刷新消息、鍵盤消息、滑鼠消息、計時器函數
等,GlutDisplayFunc()、glutPostRedisplay()、
glutReshapeFunc()、glutTimerFunc()、glutKeyboardFunc()、 glutMouseFunc()。
(3)創建複雜的三維物體。這些和aux庫的函數功能相同。創建網狀體和實心體。如glutSolidSphere()、glutWireSphere()等。
(4)功能表函數
創建添加功能表的函數GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu() 和glutAttachMenu()。
(5)程式運行函數。
glutMainLoop()。
5、16個WGL函數,專門用於OpenGL和Windows視窗系統的聯接,其首碼為wgl,主要用於創建和選擇圖形操作描述表(renderingcoNtexts)以及在視窗內任一位置顯示字元點陣圖。這類函數主要包括以下幾類
(1)繪圖上下文相關函數。
wglCreateCoNtext()、wglDeleteCoNtext()、wglGetCurrentContent()、wglGetCurrentDC() wglDeleteContent()等。
(2)文字和文本處理函數。
wglUseFontBitmaps()、wglUseFontOutlines()。
(3)覆蓋層、地層和主平面層處理函數。
wglCopyCoNtext()、wglCreateLayerPlane()、 wglDescribeLayerPlane()、wglReakizeLayerPlatte()等。
(4)其他函數。
wglShareLists()、wglGetProcAddress()等。
6、另外,還有五個Win32函數用來處理像素格式(pixel formats)和雙緩存。由於它們是對Win32系統的擴展,因此不能應用在其它OpenGL平臺上。
OPENGL 使用手冊
OpenGL 2.1 reference pages
reference pages for OpenGL 3.3
reference pages for OpenGL 4
OPENGLES reference
參考網頁
http://www.cppblog.com/summericeyl/archive/2009/03/11/76244.aspx
http://www.khronos.org/opengles/sdk/docs/man/xhtml/glHint.xml
OPENGL 使用手冊
OpenGL 2.1 reference pages
reference pages for OpenGL 3.3
reference pages for OpenGL 4
OPENGLES reference
參考網頁
http://www.cppblog.com/summericeyl/archive/2009/03/11/76244.aspx
http://www.khronos.org/opengles/sdk/docs/man/xhtml/glHint.xml