OpenGL中常用的函數


 OPengl的官方文檔如下:https://www.opengl.org/sdk/docs/man4/

  void glGetIntegerv(   GLenum pname,      GLint * data);

  返回Pname所指的OPengl中的狀態變量,放置在data指針的空間。

  •   第一個參數,表示你要得到什么狀態的值  
  • 第二個參數即輸出這個值

  說明: If glGetBooleanv is called, a floating-point (or integer) value is converted to GL_FALSE if and only if it is 0.0 (or 0). Otherwise, it is converted to GL_TRUE. If glGetIntegerv is called, boolean values are returned as GL_TRUE or GL_FALSE, and most floating-point values are rounded to the nearest integer value. Floating-point colors and normals, however, are returned with a linear mapping that maps 1.0 to the most positive representable integer value and -1.0 to the most negative representable integer value. If glGetFloatv or glGetDoublev is called, boolean values are returned as GL_TRUE or GL_FALSE, and integer values are converted to floating-point values.

  pname可以有很多符號:

GL_VIEWPORT:  返回視口左上角以及尺度。(x, y, width , Height), 這個視口是GL做渲染的視口信息, 可以其信息如同:glViewport。 也可以使用glGetIntegeri_v, 返回特定的請求值。

  void glClear(     GLbitfield mask);

 用之前函數中的glClearColor, glClearDepth, and glClearStencil.參數,清除各種緩沖。

參數:GL_COLOR_BUFFER_BIT, 重寫顏色緩沖位標志;

參數:GL_DEPTH_BUFFER_BIT, 重寫深度信息緩標志(Z軸)

  void glFinish(     void);

所有之前的Opengl命令被執行完畢后,才返回。這些命令包括:設置GL狀態,連接狀態,幀緩存內容等。

   void glFlush(     void);

在有限的時間內,強制執行之前所有的GL的命令。因為GL的所有命令或者通過網絡傳輸,后者借助於緩存命令的加速器。所有的GL命令如果依賴於之前命令的執行結果,則需要在調用之前使用glFlush。

注意,glFlush直接返回,不等待之前的GL命令是否執行完畢。

  void glEnable( GLenum cap);  void glEnablei(     GLenum cap,      GLuint index);
  void glDisable( GLenum cap);  void glDisablei(     GLenum cap,      GLuint index);

開啟或者關閉OGL服務端的功能(設置)。

參數:cap 是一個符號量,與服務端的某個功能設置相對應。

參數:index是一個服務端功能設置的索引量。

說明:可以使用 glIsEnabled or glGet兩個函數來查詢OGL當前功能設置的值。

GL_BLEND  : {}顏色混合}功能,通過顏色緩存的值,計算顏色塊的值

GL_DEPTH_TEST:深度測試功能,如果開啟,則對深度緩存進行計算更新,如果關閉,即使當前的深度緩存設定新的值,則也不更新。

GL_LINE_SMOOTH:

   GL_BLEND  混合是將源色和目標色以某種方式混合生成特效的技術

   說明理解:Blend 混合常用來繪制透明或半透明的物體。在混合中起關鍵作用的α(透明度)值實際上是將源色和目標色按給定比率進行 混合,以達到不同程度的透明。α值為0則完全透明,α值為1則完全不透明。混合操作只能在RGBA模式下進行,顏色索引模式下無法指定α值。物體的繪制順 序會影響到OpenGL的混合處理。glEnable( GL_BLEND );   // 啟用混合  glDisable( GL_BLEND );  // 禁用關閉混合

  glBlendFunc( GLenum sfactor , GLenum dfactor );         // 混合函數  sfactor 源混合因子  dfactor 目標混合因子。

  glBlendFunc( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA ); // 是最常使用的混合模式。

二維空間的顏色混合效果:

  

  混合 3D 物體時,基本原理和混合2D物體一樣,但需要將深度檢測關閉或設置為只讀。因為深度檢測會剔除被遮擋的部分物體。

    

 

   void glClearDepth(     GLdouble depth);
  void glClearDepthf(     GLfloat depth);

設置一個指定值,清除深度緩存中的所有數據。默認的初始值是1.0。 設置的值在[0, 1]區間。

    glPushAttrib(GL_ALL_ATTRIB_BITS);

 

   glOrtho(left, right, bottom, top, near, far) 

  glOrtho是創建一個正交平行的視景體。 一般用於物體不會因為離屏幕的遠近而產生大小的變換的情況。left表示視景體左面的坐標,right表示右面的坐標,bottom表示下面的,top表示上面的。這個函數簡單理解起來,就是一個物體擺在那里,你怎么去截取他。

   void glBegin(GLenummode)
    void glEnd(void)  

  參數說明:  

  mode:創建圖元的類型。可以是以下數值  

  GL_POINTS:把每一個頂點作為一個點進行處理,頂點n即定義了點n,共繪制N個點  

 

  GL_LINES:把每一個頂點作為一個獨立的線段,頂點2n-1和2n之間共定義了n條線段,總共繪制N/2條線段  

  GL_LINE_STRIP:繪制從第一個頂點到最后一個頂點依次相連的一組線段,第n和n+1個頂點定義了線段n,總共繪制n-1條線段  

  GL_LINE_LOOP:繪制從第一個頂點到最后一個頂點依次相連的一組線段,然后最后一個頂點和第一個頂點相連,第n和n+1個頂點定義了線段n,總共繪制n條線段  

  

  GL_TRIANGLES:把每個頂點作為一個獨立的三角形,頂點3n-2、3n-1和3n定義了第n個三角形,總共繪制N/3個三角形  

  GL_TRIANGLE_STRIP:繪制一組相連的三角形,對於奇數n,頂點n、n+1和n+2定義了第n個三角形;對於偶數n,頂點n+1、n和n+2定義了第n個三角形,總共繪制N-2個三角形  

  GL_TRIANGLE_FAN:繪制一組相連的三角形,三角形是由第一個頂點及其后給定的頂點確定,頂點1、n+1和n+2定義了第n個三角形,總共繪制N-2個三角形  

 

  GL_QUADS:繪制由四個頂點組成的一組單獨的四邊形。頂點4n-3、4n-2、4n-1和4n定義了第n個四邊形。總共繪制N/4個四邊形  

  GL_QUAD_STRIP:繪制一組相連的四邊形。每個四邊形是由一對頂點及其后給定的一對頂點共同確定的。頂點2n-1、2n、2n+2和2n+1定義了第n個四邊形,總共繪制N/2-1個四邊形  

  GL_POLYGON:繪制一個凸多邊形。頂點1到n定義了這個多邊形。  
函數說明:  glBegin和glEnd函數限定了一組或多組圖元的定點定義。

  glViewport(GLint x,GLint y,GLsizei width,GLsizei height)

參數說明:

X,Y————以像素為單位,指定了視口的左下角(在第一象限內,以(0,0)為原點的)位置。

width,height————表示這個視口矩形的寬度和高度,根據窗口的實時變化重繪窗口。
函數說明:
    (參數的坐標是以GL中的世界坐標系來標定的:(右手坐標系),默認在Z=0平面的,且左下角為坐標原點。(必然示這樣的定義參數定義內容)
  一旦OGL的渲染環境與一個窗口視圖相關聯,則默認觀察視口有初始值。 省時,初始視口為(0,0,cx,cy),其中cx、cy分別為窗口的寬和高。應該使視口區的長寬比與取景體積(glOrtho或者透視圖定義的的長寬比相等,否則會使顯示的圖象變形,另外在程序中應該及時接收窗口變化的事件,正確調整視見區
  此函數影響從標准設備坐標轉化為Win窗口坐標

specifies the affine transformation of xx and yy from normalized device coordinates to window coordinates. Let (xnd,ynd)xndynd be normalized device coordinates. Then the window coordinates (xw,yw)xwyw are computed as follows:

xw=(xnd+1)(width2)+xxw=xnd+1⁢width2+x
yw=(ynd+1)(height2)+y
 

   void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,

           GLdouble centerx,GLdouble centery,GLdouble centerz,

            GLdouble upx,GLdouble upy,GLdouble upz);

第一組eyex, eyey,eyez 相機在世界坐標的位置

第二組centerx,centery,centerz 相機鏡頭對准的物體在世界坐標的位置

第三組upx,upy,upz 相機向上的方向在世界坐標中的方向

你把相機想象成為你自己的腦袋:第一組數據就是腦袋的位置第二組數據就是眼睛看的物體的位置第三組就是頭頂朝向的方向(因為你可以歪着頭看同一個物體)

  通常,視點轉換操作在模型轉換操作之前發出(例如視點轉換矩陣N,模型轉換矩陣M,頂點v,結果應該為NMv,這樣才能保證M先和v相乘,即模型轉換先應 用在頂點上),以便模型轉換先對物體發生作用。場景中物體的頂點經過模型轉換之后移動到所希望的位置,然后再對場景進行視點定位等操作。模型轉換和視點轉 換共同構成模型視景矩陣。即 glMatrixMode(GL_MODELVIEW);

    glMatrixMode(GL_MODELVIEW);

  模型視圖矩陣,完成兩個效果,(1)將模型坐標系MC, Model Coordinate 映射到世界坐標系WC, World Coordinate,(2)將所有的世界坐標系WC中的模型映射到觀察坐標系(視圖坐標系)View Coordinate。

  繪制場景的時候,所有的世界坐標系WC中的操作都屬於模型矩陣;所有的后續裁剪等都屬於視圖矩陣。

  所以OGL就將這兩個過程合二為一,模型視圖模式,完成物體到視圖處理。

  glTranslatef() ——模型變換函數 移動

void glTranslatef(GLfloat  x,  GLfloat  y,  GLfloat  z);

這個函數表示模型是怎樣移動的。

舉個例子:glTranslatef(-1.0,0.0,-2.0);//表示物體沿x負方向移動1.0,沿z軸負方向移動2.0。所以就好像能看見側面一樣

  glPerspective() ——投影變換函數 透視投影

void gluPerspective(GLdouble  fovy,  GLdouble  aspect,  GLdouble  zNear,  GLdouble  zFar);

第一個參數表示在y方向上的視角度數。個人理解:比如45,表示眼睛和模型中心這個條線與y軸的夾角。

第二個參數表示縱橫比。x/y。比如2表示x、y本來都是1個長度,現在x可以當兩個長度用,這樣,模型就好像被x方向壓縮了一樣。(為了防止圖形被變形,需要設置為1)

后兩個參數glFrustum()中后兩個相近。要求都是正數。

  glRotatef()——模型變換函數  旋轉

void glRotatef(GLfloat  angle,  GLfloat  x,  GLfloat  y,  GLfloat  z);
angle表示旋轉的角度(注意單位不是弧度),(x,y,z)表示轉軸。舉個例子:
glRotatef(45.0, 0.0, 0.0, 1.0);//表示模型沿着(0,0,1)這個軸旋轉45°。

  glScalef() ——模型變換函數 縮放

void glScalef(GLfloat  x,  GLfloat  y,  GLfloat  z);
模型變換的目的是設置模型的位置和方向,例如可以對模型進行旋轉、移動和縮放,或者聯合這幾種操作。
這個函數表示模型在各軸上是如果進行縮放的。舉個例子:
glScalef (1.0, 2.0, 1.0);//表示y坐標值擴大兩倍,這樣原本方的物體就變成長的了。

     glShadeModel(GL_FLAT);

   控制opengl中繪制指定兩點間其他點顏色的過渡模式。參數一般為GL_SMOOTH(默認),GL_FLAT。opengl默認是將制定的兩點顏色進行插值,繪制之間的其他點。

如果兩點顏色不同,GL_SMOOTH會出現過渡效果,GL_FLAT 則只是以指定的某一點的單一色繪制其他所有點。

                    GL_SMOOTH                                      與                           GL_FLAT的區別

      

 glMatrixMode() 設置當前矩陣模式

mode 指定哪一個矩陣堆棧是下一個矩陣操作的目標。

GL_MODELVIEW,對模型視景矩陣堆棧應用隨后的矩陣操作.

  GL_PROJECTION,對投影矩陣應用隨后的矩陣操作.
  GL_TEXTURE,對紋理矩陣堆棧應用隨后的矩陣操作.
  與glLoadIdentity()一同使用
    glLoadIdentity(): 將當前的用戶坐標系的原點移到了屏幕中心:類似於一個復位操作
    在glLoadIdentity()之后我們為場景設置了 透視圖。glMatrixMode(GL_MODELVIEW)設置當前 矩陣為模型視圖矩陣,模型視圖矩陣儲存了有關物體的信息。
(1)如果參數是GL_PROJECTION
就是要對投影相關進行操作,也就是把物體投影到一個平面上。接下來的語句可以是跟透視相關的函數,比如glFrustum()或gluPerspective();
在操作投影矩陣以前,需要調用函數:
glMatrixode(GL_PROJECTION); //將當前矩陣指定為投影矩陣
然后把矩陣設為單位矩陣:
glLoadIdentity();
然后調用glFrustum()或gluPerspective(),它們生成的矩陣會與當前的矩陣相乘,生成透視的效果;
(2)如果參數是GL_MODELVIEW
這個是對模型視景的操作,接下來的語句描繪一個以模型基礎以及視圖變換。以及像gluLookAt()這樣的函數;
(3)若是GL_TEXTURE,就是對紋理相關進行操作
    
  這幾種矩陣模式可以反復切換。如:
要使用透視(3D).那么先要設置透視投影
glMatrixMode(GL_PROJECTION); //切換到投影矩陣.
//...設置透視投影的命令
//設置完成后開始畫圖,需要切換到 模型視圖矩陣 才能正確畫圖.
glMatrixMode(GL_MODELVIEW);
// 畫一個物體A (這個時候,看起來是3D的效果,因為前面設置的透視矩陣,默認示透視投影即3D效果)
// 如這時候需畫一個 2D效果的物體A,那么又需要透視投影,改后修改為正交投影。
glMatrixMode(GL_PROJECTION); //切換到投影矩陣..
// ..設置正交投影(2D效果)
//..設置完成,切換回模型視圖矩陣.....
glMatrixMode(GL_MODELVIEW);
// 再畫一個物體A (這個時候,看起來是2D的,因為在投影矩陣中設置了正交矩陣類型)

// 如從頭到尾都是只畫3D視圖, 或者是只畫2D視圖, 只需初始化時設置一次(在MODELVIEW之前設置).
// 如果有交替,那么就需要glMatrixMode() 切換

因這樣設置很煩人,所以又有glPushMatrix() 保存當前矩陣信息。

end:

  www.icmzn.com

 


免責聲明!

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



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