openGL從零學起之入門介紹


  最近項目中涉及到了一些特效,如字體描邊、場景調色和精靈的一些着色等,接觸到了openGl部分,再加上之前有過unity3d的開發經驗,就越發的對openGl感興趣,應該說是對3D感興趣吧。其實自己一直都感興趣的就是虛擬現實的仿真技術和人工智能,希望以后能有機會進入這兩個領域。廢話不多說,直接開始openGl之旅,這個以前沒接觸過,有什么理解不到位或者完全錯誤的地方,請大神們直接指出,在此謝過了。

  當前,三維圖形編程工具中最為突出的是SGI公司的OpenGL(Open Graphics Language,開放式的圖形語言),它已經成為一個工業標准的計算機三維圖形軟件開發接口。值得一提的是,雖然微軟有自己的三維編程開發工具DirectX,但它也提供OpenGL圖形標准,因此,OpenGL可以在微機中廣泛應用。OpenGL非常接近硬件,是一個圖形與硬件的接口,包括了100多個圖形函數用來建立三維模型和進行三維實時交互。

  簡單地說,OpenGL具有建模、變換、色彩處理、光線處理、紋理影射、圖像處理、動畫及物體運動模糊等功能,具體內容會逐步學習。

  大體概括一下openGl的渲染繪制過程:

根據基本圖元建模(OpenGL中把“點、線、多邊形、圖像和位圖”都作為基本圖形單元)。

調整模型位置和設置視圖觀察點。

渲染色彩,添加光照、材質和紋理映射。

光棧化:把模型的數學描述信息和色彩信息轉化為計算機屏幕上的像素,完成繪制。

庫函數

  開發基於OpenGL的應用程序,必須先了解OpenGL的庫函數。它采用C語言風格,提供大量的函數來進行圖形的處理和顯示。

  常用四種函數庫來提供所需要的函數,分別是基本庫、實用庫、輔助庫、工具庫。我們需要記住一些常用函數是出自哪個庫的,因為不同的庫的函數前綴不同

1、基本庫:核心庫

包含的函數有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()等。

 

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

包含的函數功能更高級一些,如繪制復雜的曲線曲面、高級坐標變換、多邊形分割等,共有43個,前綴為“glu”

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

庫中常用函數:

<1>輔助紋理貼圖函數

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

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

相對於基本庫,這里的變換函數更高級一些,個人感覺體現在維度的不同,偏三維更復雜。

  透視投影:gluPerspective()

  正交投影:gluOrtho2D()

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

<3>二次曲面繪制工具

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

  球面:gluSphere()

  圓柱面:gluCylinder()

<4>錯誤反饋工具

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

 

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

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

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

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

因此這里就不再研究,重點研究的工具庫。

4、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);

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM