openGL學習筆記(1)——幾個函數

(一)gl,glu,glut的區別

OpenGL中的gl庫是核心庫,glu是實用庫,glut是實用工具庫,
gl是核心,glu是對gl的部分封裝,glut是OpenGL的跨平臺工具庫,gl中包含了最基本的3D函數,而glu似乎對gl的輔助,如果算數好,不用glu的情況下,也是可以做出同樣的效果。
glut是基本的窗口界面,是獨立於gl和glu的,如果不喜歡用glut可以用MFC和Win32窗口等代替,但是glut是跨平臺的,這就保證了我們編出的程序是跨平臺的,如果用MFC或者Win32只能在windows操作系統上使用。選擇OpenGL的一個很大原因就是因爲它的跨平臺性,所以我們可以儘量的使用glut庫。
opengl 實用庫 : 43個函數,以glu開頭,包括紋理映射、座標變換、多邊形分化、繪製一些如橢球、圓柱、茶壺等簡單多邊形實體 部分函數象核心函數一樣在任何OpenGL平臺都可以應用。
opengl輔助庫: 31個函數,以aux 開頭,
OpenGL函數庫相關的API有核心庫(gl)、實用庫(glu)、輔助庫(aux)、實用工具庫(glut)、窗口庫(glx、agl、wgl)和擴展函數庫等。從圖1可以看出,gl是核心,glu是對gl的部分封裝。glx、agl、wgl 是針對不同窗口系統的函數。glut是爲跨平臺的OpenGL程序的工具包,比aux功能強大。擴展函數庫是硬件廠商爲實現硬件更新利用OpenGL的擴展機制開發的函數。

轉載自:http://dxwang.blog.51cto.com/384651/698750

(二)一些函數的詳細用法

glBegin()

1.在glBegin()和glEnd()之間可調用的函數
函數 函數意義
glVertex*() 設置頂點座標
glColor*() 設置當前顏色
glIndex*() 設置當前顏色表
glNormal*() 設置法向座標
glEvalCoord*() 產生座標
glCallList(),glCallLists() 執行顯示列表
glTexCoord*() 設置紋理座標
glEdgeFlag*() 控制邊界繪製
glMaterial*() 設置材質
以上爲可在glBegin()和glEnd()之間可調用的函數

glVertex3f()表示了該函數屬於gl庫,參數是三個float型參數指針。我們用glVertex*()來表示這一類函數。

基本庫
2.幾何圖元類型和說明
類型             說明
GL_POINTS 單個頂點集
GL_LINES 多組雙頂點線段
GL_POLYGON 單個簡單填充凸多邊形
GL_TRAINGLES 多組獨立填充三角形
GL_QUADS 多組獨立填充四邊形
GL_LINE_STRIP 不閉合折線
GL_LINE_LOOP 閉合折線
GL_TRAINGLE_STRIP 線型連續填充三角形串
GL_TRAINGLE_FAN 扇形連續填充三角形串
GL_QUAD_STRIP 連續填充四邊形串
gluLookAt()

函數原型爲

void gluLookAt(
GLdouble eyex,
GLdouble eyey,
GLdouble eyez,
GLdouble centerx,
GLdouble centery,
GLdouble centerz,
GLdouble upx,
GLdouble upy,
GLdouble upz
);

gluLookAt()共有九個參數,三個一組,分爲三組,分別是眼睛的位置,眼睛朝向的位置,以及相片朝上的方向。

詳細介紹參考:http://blog.163.com/zhaoxin851055@126/blog/static/81129298200921052929831/

glMatrixMode()

這個函數是對模型矩陣進行變換,即對接下來要做什麼進行一下聲明,可選值: GL_MODELVIEW、GL_PROJECTION、GL_TEXTURE.

如果參數是GL_PROJECTION,這個是投影的意思,就是要對投影相關進行操作,也就是把物體投影到一個平面上,就像我們照相一樣,把3維物體投到2維的平面上。這樣,接下來的語句可以是跟透視相關的函數,比如glFrustum()或gluPerspective();
在opengl中,視圖和模型變換是在一個矩陣中進行控制的,這個矩陣就是GL_MODELVIEW_MATRIX,可以使用glGetFloatv函數來獲取這個矩陣,而我們所要使用glTranslate*, glRotate*,glScale* 等操作均最後反映到這個矩陣的變化中,所以瞭解這個矩陣的構造對於靈活運用OpenGL比較重要。

變換矩陣在內存中的存放方式如下:
m[0] m[4] m[ 8] m[12]

m[1] m[5] m[ 9] m[13]

m[2] m[6] m[10] m[14]

m[3] m[7] m[11] m[15]

可以看出,OpenGL是以列序來存放這個矩陣的,位於矩陣上方的3*3矩陣是旋轉矩陣,可以用來控制剛體的旋轉和尺度變化,如下:
m[0] m[4] m[ 8]

m[1] m[5] m[ 9]

m[2] m[6] m[10]

而左上角的3*1矩陣是用來控制剛體的平移的。就是m[12],m[13],m[14]這三個值,分別控制X,Y ,Z方向的平移。所有16個值組成一標準的齊次矩陣。

參考博文:http://www.cnblogs.com/txwd0033/archive/2009/09/25/1574087.html

若是GL_TEXTURE,就是對紋理相關進行操作;
順便說下,OpenGL裏面的操作,很多是基於對矩陣的操作的,比如位移,旋轉,縮放,所以,這裏其實說的規範一點就是glMatrixMode是用來指定哪一個矩陣是當前矩陣,而它的參數代表要操作的目標,GL_PROJECTION是對投影矩陣操作,GL_MODELVIEW是對模型視景矩陣操作,GL_TEXTURE是對紋理矩陣進行隨後的操作。

參考博文:http://blog.sina.com.cn/s/blog_61ac952e0100grop.html
gluPerspective()

函數原型
  void gluPerspective(   GLdouble fovy, //角度
  GLdouble aspect,//視景體的寬高比
  GLdouble zNear,//沿z軸方向的兩裁面之間的距離的近處
  GLdouble zFar //沿z軸方向的兩裁面之間的距離的遠處
  )

 

詳細介紹:http://www.cppblog.com/COOOOOOOOL/archive/2009/12/30/104255.html講的非常詳細,有圖有真相。

透視投影原理介紹:《深入探索透視投影變換》

gluPerspective()與gluLookAt()的關係

http://wenku.baidu.com/view/ead1690c844769eae009ed06.html

glViewport()函數和glOrtho()函數的理解

http://blog.163.com/bingcaihuang@126/blog/static/198942122010015104833960/

發佈了22 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章