openGL從零學起之入門介紹

  最近項目中涉及到了一些特效,如字體描邊、場景調色和精靈的一些着色等,接觸到了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來負責解釋執行。

例如:

<1>繪製--基本--幾何圖元的函數

  glBegain()、glEnd()、glNormal*()、glVertex*()

<2>矩陣操做、幾何變換和投影變換的函數

  矩陣入棧:glPushMatrix()                   位置變換:glTranslate*()          投影變換函數glOrtho()、glFrustum()  

  矩陣出棧:glPopMatrix()                     旋轉變換:glRotate*()                 視口變換函數glViewport()   

  裝載矩陣:glLoadMatrix()                   縮放變換:glScale*()

  矩陣相乘:glMultMatrix()                    

  矩陣模式:glMatrixMode()

  矩陣標準化:glLoadIdentity()

<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>曲線與曲面的繪製函數

  生成曲線或曲面的函數glMap*()、glMapGrid*(),求值器的函數glEvalCoord*() glEvalMesh*()。

<9>狀態設置與查詢函數

  glGet*()、glEnable()、glGetError()等。

 

二、實用庫(OpenGL utility library,GLU)

包含的函數功能更高級一些,如繪製複雜的曲線曲面、高級座標變換、多邊形分割等,共有43個,前綴爲「glu」

Glu函數經過調用核心庫的函數,爲開發者提供相對簡單的用法,實現一些較爲複雜的操做,即作了一個封裝。

庫中經常使用函數:

<1>輔助紋理貼圖函數

  gluScaleImage() 、gluBuild1Dmipmaps()、gluBuild2Dmipmaps()。

<2>座標轉換和投影變換函數

相對於基本庫,這裏的變換函數更高級一些,我的感受體如今維度的不一樣,偏三維更復雜。

  透視投影:gluPerspective()

  正交投影:gluOrtho2D()

  三維視點(觀察點):gluLookAt()

<3>二次曲面繪製工具

  建立和刪除二次曲面:gluNewQuadric()、gluDeleteQuadric()

  球面:gluSphere()

  圓柱面:gluCylinder()

<4>錯誤反饋工具

  獲取出錯信息的字符串gluErrorString()等。

 

三、OpenGL輔助庫(OpenGL auxiliarylibrary,GLAUX)

包括簡單的窗口管理、輸入事件處理、某些複雜三維物體繪製等函數,共有31個,前綴爲aux。

建立aux庫是爲了學習和編寫OpenGL程序,它更像是一個用於測試創意的預備基礎接管。

Aux庫在windows實現有不少錯誤,所以很容易致使頻繁的崩潰。在跨平臺的編程實例和演示中,aux很大程度上已經被glut庫取代。OpenGL中的輔助庫不能在全部的OpenGL平臺上運行。

所以這裏就再也不研究,重點研究的工具庫。

四、OpenGL工具庫(OpenGL Utility ToolKit)

包含大約30多個函數,函數名前綴爲「glut」,此函數由glut.dll來負責解釋執行。

經常使用函數包括:

<1>窗口操做函數

  窗口初始化:glutInit(),對GLUT進行初始化,這個函數必須在其它的GLUT使用以前調用一次。其格式比較死板,通常照抄這句glutInit(&argc, argv)就能夠了。

  窗口顯示模式:glutInitDisplayMode(),設置顯示方式。

  窗口大小:glutInitWindowSize()。

  窗口位置:glutInitWindowPosition()

  窗口建立:glutCreateWindow("窗口標題"),根據前面設置的信息建立窗口。窗口被建立後,並不當即顯示到屏幕上,須要調用glutMainLoop才能看到窗口。

  設置繪圖函數:glutDisplayFunc(),傳入一個用來繪圖的函數進行繪製。

  開啓繪圖循環:glutMainLoop,死循環,監聽全部事件處理。

<2>回調函數

  響應刷新消息、鍵盤消息、鼠標消息、定時器函數等,GlutDisplayFunc()、glutPostRedisplay()、 glutReshapeFunc()、glutTimerFunc()、glutKeyboardFunc()、 glutMouseFunc()。

<3>建立複雜的三維物體

  實心球體:glutSolidSphere()

  網狀球體:glutWireSphere()

<4>菜單函數

  建立添加菜單的函數GlutCreateMenu()、glutSetMenu()、glutAddMenuEntry()、glutAddSubMenu() 和glutAttachMenu()。

 

OpenGl數據類型

 和C語言中的類型差很少,只不過在類型名前添加前綴:GL

如:GLint整型、GLfloat浮點型、GLvoid空類型等

OpenGl函數命名規律

以點系列函數名爲例: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);

 

說了這麼多,都是一些基本概念,下一篇開始對每個知識點進行梳理並寫出完整的小例子。

相關文章
相關標籤/搜索