OpenGL基礎函數

來源:互聯網
上載者:User

 

glViewport()函數

在OpenGL初始化完成之後,我們應該進行一些視圖設定。首先是設定視見地區,即告訴OpenGL應把渲染之後的圖形繪製在表單的哪個部位。當視見地區是整個表單時,OpenGL將把渲染結果繪製到整個視窗。我們調用glViewPort函數來決定視見地區:

procedure glViewPort(x:GLInt;y:GLInt;Width:GLSizei;Height:GLSizei);

其中,參數X,Y指定了視見地區的左下角在視窗中的位置,一般情況下為(0,0),Width和Height指定了視見地區的寬度和高度。注意OpenGL使用的視窗座標和WindowsGDI使用的視窗座標是不一樣的。圖3.1-1表示了在WindowsGDI中的視窗座標,而圖3.1-2則是OpenGL所定義的視窗座標。

例如,要設定3.1-3中的視見地區,我們應該調用函數:

      glViewPort(100,100,Width,Height);

glMatrixMode()

指定哪一個矩陣是當前矩陣
C語言描述void glMatrixMode(GLenum mode)
參數mode指定哪一個矩陣堆棧是下一個矩陣操作的目標,可選值:GL_MODELVIEW、GL_PROJECTION、GL_TEXTURE.

說明

glMatrixMode設定當前矩陣模式:
GL_MODEVIEW,對模型視景矩陣堆棧應用隨後的矩陣操作。
GL_PROJECTION,對投影矩陣應用隨後的矩陣操作。
GLTEXTURE,對紋理矩陣堆棧應用隨後的矩陣操作。

glLoadIdentity()
該函數的功能是重設當前指定的矩陣為單位矩陣。在glLoadIdentity()之後我們為情境設定了透視圖。glMatrixMode(GL_MODELVIEW)設定當前矩陣為模型視圖矩陣,模弄視圖矩陣儲存了有關物體的信。

gluOrtho2D()
gluOrtho2D(-5.0,5.0,-5.0,5.0);
參數分別代表(左下角x座標,右上方x座標,左下角y座標,右上方y座標)——座標全相對於視窗左下角--原點),near和far預設為-1和1,此函 數決定一個平行六面體,即View Volume!     View Volume越大,裡面的物體顯得越小!如,一個點的座標是(0,0,0)就是在平行六面體的中間,也就是在viewport的中間;又如一個點的座標是(-5.0,-5.0,0),是在平行六面體的左下角,也就是在vieport的左下角。
註:viewport是指視窗的大小,就好像我們的眼睛!viweport可以用下面函數指定:glViewport(左下角x座標, 左下角y座標, wigth, height); ,預設是(0,0,視窗的寬度,視窗的高度)可以用gluOrtho函數來指定near和far,gluOrtho(Xmin,Xmax,Ymin,Ymax,near,far);

glTranslatef()
glTranslatef的作用就是移動座標原點。對應的3個參數對應著3個座標軸。如果你調用一次glTranslatef(1.0f,0.0f,0.0f)然後畫一個小球,接著再調用次glTranslatef(0.0f,1.0f,0.0f)再畫一個小球。此時,兩個小球中,一個在另外一個正右方。所以,如果要使兩個小球分別處於x、y軸,則需要在第二次畫之前調用glLoadIdentity()函數,使座標原點歸位。另外,此處的座標係為右手座標系。

glPushMatrix() glPopMatrix()
相當於棧裡的入棧和出棧。
許多人不明白的可能是入的是什麼,出的又是什麼。我也是自己反覆做了下測試才懂的.例如你當前的座標系原點在你電腦螢幕的左上方。現在你調用glPushMatrix,然後再調用一堆平移、旋轉代碼等等,然後再畫圖。那些平移和旋轉都是基於坐上角為原點進行變化的。而且都會改變座標的位置,經過了這些變化後,你的座標肯定不再左上方了。那如果想恢複怎麼辦呢?這時就調用glPopMatrix從棧裡取出一個“狀態”了,這個狀態就是你調用glPushMatrix之前的那個狀態。就如很多opengl的書上所講:調用glPushMatrix其實就是把目前狀態做一個副本放入堆棧之中。

glRasterPos2i()
glRasterPos2i(200, 200); 改變光柵位置
光柵(Raster):由像素構成的一個矩形網格。要在光柵上顯示的資料儲存於幀緩衝內。

glBitmap()
當設定了光柵位置後,就可以調用glBitmap()函數來顯示位元影像資料了。這個函數形式為:
void glBitmap( GLsizei width,GLsizei height,GLfloat xbo,GLfloat ybo,GLfloat xbi,GLfloat ybi,const GLubyte *bitmap);
顯示由bitmap指定的位元影像,bitmap是一個指向位元影像的指標。位元影像的原點放在 最近定義的當前光柵位置上。若當前光柵位置是無效的,則不顯示此位元影像或其一部分,而且當前光柵位置仍然無效。參數width和height一象素為單位說 明位元影像的寬行高。寬度不一定是8的倍數。參數xbo和ybo定義位元影像的原點(正值時,原點向上移動;負值時,原點向下移動)。參數xbi和ybi之處在位 圖光柵化後光柵位置的增量。

glReadPixels()讀取象素資料,void glReadPixels(GLint x,GLint y,GLsizesi width,GLsizei height,GLenum format,GLenum type,GLvoid *pixel);函數參數(x,y)定義映像地區左下角點的座標,width和height分別是映像的高度和寬度,*pixel是一個指標,指向儲存映像資料的數組。參數format指出所讀象素資料元素的格式(索引值或R、G、B、A值,如表11-1所示),而參數type指出每個元素的資料類型(見表11-2)。名稱                 象素資料類型GL_INDEX          單個色彩索引GL_RGB                  先是紅色分量,再是綠色分量,然後是藍色分量GL_RED                  單個紅色分量GL_GREEN          單個綠色分量GL_BLUE          單個藍色分量GL_ALPHA          單個Alpha值GL_LUMINANCE_ALPHA  先是亮度分量,然後是Alpha值GL_STENCIL_INDEX  單個的模板索引GL_DEPTH_COMPONENT  單個深度分量表11-1 函數glReadPixels()及glDrawPixels()的象素格式名稱             資料類型GL_UNSIGNED_BYTE    無符號的8位整數GL_BYTE      8位整數GL_BITMAP      無符號的8位整數數組中的單個數位GL_UNSIGNED_SHORT   無符號的16位整數GL_SHORT      16位整數GL_UNSIGNED_INT     無符號的32位整數GL_INT              32位整數GL_FLOAT      單精確度浮點數表11-2 函數glReadPixels()及glDrawPixels()的象素資料類型
glDrawPixels()寫入象素資料void glDrawPixels(GLsizesi width,GLsizei height,GLenum format,GLenum type,GLvoid *pixel);函數參數format和type與glReadPixels()有相同的意義,pixel指向的數組包含所要畫的象素資料。注意,調用這個函數前必須先設定當前光柵位置,若當前光柵位置無效,則給出該函數時不畫任何圖形,並且當前光柵位置仍然保持無效。glCopyPixels()象素拷貝函數是: void glCopyPixels(GLint x,GLint y,GLsizesi width,GLsizei height, GLenum type);這個函數使用起來有點類似於先調用glReadPixels()函數後再調用 glDrawPixels()一樣,但它不需要將資料寫到記憶體中去,因它只將資料寫到framebuffer裡。函數功能就是拷貝framebuffer 中左下角點在(x,y)尺寸為width、height的矩形地區象素資料。資料拷貝到一個新的位置,其左下角點在當前光柵的位置,參數type可以是GL_COLOR、GL_STENCIL、GL_DEPTH。在拷貝過程中,參數type要按如下方式轉換成format:

  1)若type為GL_DEPTH或GL_STENCIL,那麼format應分別是GL_DEPTH_COMPONENT或GL_STENCIL_INDEX;
2)若type為GL_COLOR,format則用GL_RGB或GL_COLOR_INDEX,這要依賴於圖形系統是處於RGBA方式還是處於顏色表方式。

glPixelZoom()一般情況下,映像的一個象素寫到螢幕上時也是一個象素,但是有時也需要將映像放大或縮小,OpenGL提供了這個函數:映像縮放 void glPixelZoom(GLfloat zoomx,GLfloat zoomy);設定象素寫操作沿X和Y方向的放大或縮小因子。預設情況下,zoomx、zoomy都是1.0。如果它們都是2.0,則每個映像象素被畫到4個螢幕象素上面。注意:小數形式的縮放因子和負數因子都是可以的。glutSwapBuffers()交換緩衝顯存在雙緩衝模式下,遊戲運行時佔用3個圖象記憶體地區。其中一個是“視窗記憶體”。其他兩個是“緩衝顯存1”和“緩衝顯存2”。用glBegin()進行渲染後用glutSwapBuffers,顯卡負責把“緩衝顯存1”的畫面複製到“視窗記憶體”中。然後再用glBegin()進行渲染,畫面就先渲染到“緩衝顯存2”上面了。這時候顯卡還在忙著把“緩衝顯存1”上的內容拷貝到“視窗記憶體”中呢。所以“渲染過程”和“顯示過程”兩不誤!
glutPostRedisplay()如果是單線程,僅僅用postredisplay而不返回是走不到display的。應該把這個迴圈拆開,迴圈體放在idle裡。glFrustum()glFrustum(left,right,bottom,top,near,far);  參數用來確定視角邊界的各個點。我們的目的就是要通過glFrustum的調用來確定紅色地區。首先,圖片左側的圓點就是座標原點(0,0,0),黃色的近平面的左下角座標(從座標原點往黃色平面看)用(left, bottom, -near)來指定,而近平面的右上方座標則用(right, top,-near)來指定。為了確定紅色地區,我們還缺少遠平面的座標點。實際上我們只需要知道遠平面的Z座標far就可以確定這個平面了。因為遠平面的四個角的座標可以用原點和近平面四個角的射線和遠平面相交來確定。因此我們只需要設定(left,bottom, -near)、(right, top,-near)以及-far等值就可以確定紅色的可視地區了,這也就構成了glFrustum函數的幾個參數。glBegin()OpenGL通過將物體抽象為笛卡爾座標系下點、線段、多邊形的集合,再將點、線段、多邊形等通過在函數glBegin()與glEnd()之間的一系列頂點資料,繪製出圖形還原物體。OpenGL通過glBegin()與glEnd()函數完成點、線、三角形、四邊形及多邊形的繪製glBegin(GLenum)數GLenum有以下10個參數:GL_POINTS:表示將要繪製點GL_LINES:表示函數開始繪製線GL_LINE_STRIP:表示函數將開始繪製折線GL_LINE_LOOP:表示函數將開始繪製閉合曲線GL_TRIANLES:表示函數開始繪製三角形GL_TRIANLE_STRIP:表示函數將開始繪製三角形片GL_TRIANLE_FAN:表示函數將開始繪製三角形扇GL_QUADS:表示函數開始繪製四邊形GL_QUAD_STRIP:表示函數開始繪製多邊形片GL_POLYGON:表示函數繪製多邊形
glRotatef()物體圍繞指定向量旋轉指定角度glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLfloat z)angle毋庸置疑就是旋轉的角度,而x,y,z三個參數則應該看成一個整體表示一個向量,表示物體圍繞向量[x,y,z]旋轉。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.