最近項目中涉及到了一些特效,如字體描邊、場景調色和精靈的一些着色等,接觸到了openGl部分,再加上以前有過unity3d的開發經驗,就愈加的對openGl感興趣,應該說是對3D感興趣吧。其實本身一直都感興趣的就是虛擬現實的仿真技術和人工智能,但願之後能有機會進入這兩個領域。廢話很少說,直接開始openGl之旅,這個之前沒接觸過,有什麼理解不到位或者徹底錯誤的地方,請大神們直接指出,在此謝過了。編程
當前,三維圖形編程工具中最爲突出的是SGI公司的OpenGL(Open Graphics Language,開放式的圖形語言),它已經成爲一個工業標準的計算機三維圖形軟件開發接口。值得一提的是,雖然微軟有本身的三維編程開發工具DirectX,但它也提供OpenGL圖形標準,所以,OpenGL能夠在微機中普遍應用。OpenGL很是接近硬件,是一個圖形與硬件的接口,包括了100多個圖形函數用來創建三維模型和進行三維實時交互。windows
簡單地說,OpenGL具備建模、變換、色彩處理、光線處理、紋理影射、圖像處理、動畫及物體運動模糊等功能,具體內容會逐步學習。數組
大致歸納一下openGl的渲染繪製過程:函數
①根據基本圖元建模(OpenGL中把「點、線、多邊形、圖像和位圖」都做爲基本圖形單元)。工具
②調整模型位置和設置視圖觀察點。oop
③渲染色彩,添加光照、材質和紋理映射。學習
④光棧化:把模型的數學描述信息和色彩信息轉化爲計算機屏幕上的像素,完成繪製。開發工具
開發基於OpenGL的應用程序,必須先了解OpenGL的庫函數。它採用C語言風格,提供大量的函數來進行圖形的處理和顯示。測試
經常使用四種函數庫來提供所須要的函數,分別是基本庫、實用庫、輔助庫、工具庫。咱們須要記住一些經常使用函數是出自哪一個庫的,由於不一樣的庫的函數前綴不一樣。字體
包含的函數有115個,提供最基本的函數,其前綴是「gl」;這部分函數用於常規的、核心的圖形處理,由gl.dll來負責解釋執行。
例如:
glBegain()、glEnd()、glNormal*()、glVertex*()
矩陣入棧:glPushMatrix() 位置變換:glTranslate*() 投影變換函數glOrtho()、glFrustum()
矩陣出棧:glPopMatrix() 旋轉變換:glRotate*() 視口變換函數glViewport()
裝載矩陣:glLoadMatrix() 縮放變換:glScale*()
矩陣相乘:glMultMatrix()
矩陣模式:glMatrixMode()
矩陣標準化:glLoadIdentity()
顏色:glColor*()、glIndex*()
光照:glLight*() 、glLightModel*()
材質:glMaterial*()
建立:glNewList()
結束:glEndList()
生成:glGenLists()
調用:glCallList()
刪除:glDeleteLists()
一維紋理:glTexImage1D()
二維紋理:glTexImage2D()
設置紋理參數:glTexParameter*()
紋理環境:glTexEnv*()
紋理座標:glTetCoord*()
融合函數glBlendFunc()、反走樣函數glHint()和霧化效果glFog*()。
像素位置:glRasterPos*()
線型寬度:glLineWidth()
多邊形繪製模式:glPolygonMode()
讀取象素:glReadPixel()
複製象素:glCopyPixel()
生成曲線或曲面的函數glMap*()、glMapGrid*(),求值器的函數glEvalCoord*() glEvalMesh*()。
glGet*()、glEnable()、glGetError()等。
包含的函數功能更高級一些,如繪製複雜的曲線曲面、高級座標變換、多邊形分割等,共有43個,前綴爲「glu」。
Glu函數經過調用核心庫的函數,爲開發者提供相對簡單的用法,實現一些較爲複雜的操做,即作了一個封裝。
庫中經常使用函數:
gluScaleImage() 、gluBuild1Dmipmaps()、gluBuild2Dmipmaps()。
相對於基本庫,這裏的變換函數更高級一些,我的感受體如今維度的不一樣,偏三維更復雜。
透視投影:gluPerspective()
正交投影:gluOrtho2D()
三維視點(觀察點):gluLookAt()
建立和刪除二次曲面:gluNewQuadric()、gluDeleteQuadric()
球面:gluSphere()
圓柱面:gluCylinder()
獲取出錯信息的字符串gluErrorString()等。
包括簡單的窗口管理、輸入事件處理、某些複雜三維物體繪製等函數,共有31個,前綴爲aux。
建立aux庫是爲了學習和編寫OpenGL程序,它更像是一個用於測試創意的預備基礎接管。
Aux庫在windows實現有不少錯誤,所以很容易致使頻繁的崩潰。在跨平臺的編程實例和演示中,aux很大程度上已經被glut庫取代。OpenGL中的輔助庫不能在全部的OpenGL平臺上運行。
所以這裏就再也不研究,重點研究的工具庫。
包含大約30多個函數,函數名前綴爲「glut」,此函數由glut.dll來負責解釋執行。
經常使用函數包括:
窗口初始化:glutInit(),對GLUT進行初始化,這個函數必須在其它的GLUT使用以前調用一次。其格式比較死板,通常照抄這句glutInit(&argc, argv)就能夠了。
窗口顯示模式:glutInitDisplayMode(),設置顯示方式。
窗口大小:glutInitWindowSize()。
窗口位置:glutInitWindowPosition()
窗口建立:glutCreateWindow("窗口標題"),根據前面設置的信息建立窗口。窗口被建立後,並不當即顯示到屏幕上,須要調用glutMainLoop才能看到窗口。
設置繪圖函數:glutDisplayFunc(),傳入一個用來繪圖的函數進行繪製。
開啓繪圖循環:glutMainLoop,死循環,監聽全部事件處理。
響應刷新消息、鍵盤消息、鼠標消息、定時器函數等,GlutDisplayFunc()、glutPostRedisplay()、 glutReshapeFunc()、glutTimerFunc()、glutKeyboardFunc()、 glutMouseFunc()。
實心球體:glutSolidSphere()
網狀球體:glutWireSphere()
建立添加菜單的函數GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu() 和glutAttachMenu()。
和C語言中的類型差很少,只不過在類型名前添加前綴:GL
如:GLint整型、GLfloat浮點型、GLvoid空類型等
以點系列函數名爲例:glVertex*()系列
glVertex2d
glVertex2f
glVertex3f
glVertex3fv
數字表示參數的個數,2表示有兩個參數,3表示三個,4表示四個。
字母表示參數的類型:
s 短整型,表示16位整數(OpenGL中將這個類型定義爲GLshort),
i 整型,表示32位整數(OpenGL中將這個類型定義爲GLint和GLsizei),
f 浮點型,表示32位浮點數(OpenGL中將這個類型定義爲GLfloat和GLclampf),
d 雙精度浮點型,表示64位浮點數(OpenGL中將這個類型定義爲GLdouble和GLclampd)。
v 數組型,表示傳遞的幾個參數將使用指針的方式。
GLfloat VertexArr3[] = {1.0f, 3.0f, 0.0f};//這三個參數以數組的形式傳遞過去
glVertex3fv(VertexArr3);
說了這麼多,都是一些基本概念,下一篇開始對每個知識點進行梳理並寫出完整的小例子。