1. 程式人生 > >OpenGL入門(二):第一個OpenGL程式

OpenGL入門(二):第一個OpenGL程式

在上一篇中的環境配置沒有問題,估計程式出現了問題。

OpenGL實用庫函式:43個,以glu作為字首;
OpenGL輔助庫函式:31個,以aux作為字首;
Windows專用庫函式(WGL):6個,以wgl作為字首;
win32API函式(WGL):5個,無字首。

首先建立工程,步驟如下:
(1)建立Win32 Console Application
(2)在附加依賴庫上加入opengl32.lib;glut32.lib;glu32.lib

程式碼如下:


#include <gl/glut.h> 

void renderScene(void)
{
         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    //清除緩衝,GL_COLOR_BUFFER_BIT :顏色緩衝標誌位
glLoadIdentity(); //重置當前矩陣為4*4的單位矩陣 //glRotatef(-135,0.5,0.0,0.0); //旋轉 //glTranslatef(0.5,0.5,0.0); //移動原點 //glScalef(0.5,0.5,1); //縮小 glBegin(GL_TRIANGLES); glVertex3f(-0.5
,-0.5,0.0); glVertex3f(0.5,0.0,0.0); glVertex3f(0.0,0.0,0.0); glEnd(); glutSwapBuffers(); //交換兩個緩衝區指標 } int main(int argc, char* argv[]) { glutInit(&argc, argv);//初始化glut庫 glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE
| GLUT_RGBA);//設定初始顯示模式 glutInitWindowPosition(100,100); glutInitWindowSize(600,600); glutCreateWindow("*************"); glutDisplayFunc(renderScene); glutMainLoop();//enters the GLUT event processing loop. return 0; }

說明:
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
函式功能:設定初始顯示模式;

對應巨集定義 意義
GLUT_RGB 0x0000 指定RGB顏色模式的視窗
GLUT_RGBA 0x0000 指定RGBA 顏色模式的視窗
GLUT_INDEX 0x0001 指定顏色索引模式的視窗
GLUT_SINGLE 0x0000 指定單快取視窗
GLUT_DOUBLE v0x0002 指定雙快取視窗
GLUT_ACCUM 0x0004 視窗使用累加快取
GLUT_ALPHA 0x0008 視窗的顏色分量包含 alpha 值
GLUT_DEPTH 0x0010 視窗使用深度快取
GLUT_STENCIL 0x0020 視窗使用模板快取
GLUT_MULTISAMPLE 0x0080 指定支援多樣本功能的視窗
GLUT_STEREO 0x0100 指定立體視窗
GLUT_LUMINANCE 0x0200 視窗使用亮度顏色模型

glutDisplayFunc(renderScene);
glutDisplayFunc(void(*func)(void));
函式功能:註冊當前視窗的顯示回撥函式,執行繪製操作。
引數:
func:形為void func()的函式,完成具體的繪製操作。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
函式功能:表明需要清除的緩衝標誌位
GL_COLOR_BUFFER_BIT :當前可寫的顏色緩衝
GL_DEPTH_BUFFER_BIT :深度緩衝
GL_ACCUM_BUFFER_BIT:累積緩衝
GL_STENCIL_BUFFER_BIT:模板緩衝
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
  第一條語句表示清除顏色設為黑色,第二條語句表示實際完成了把整個視窗清除為黑色的任務,glClear()的唯一引數表示需要被清除的緩衝區。
畫素檢驗、裁剪檢驗、抖動和快取的寫遮蔽都會影響glClear的操作,其中,裁剪範圍限制了清除的區域,而glClear命令還會忽略alpha函式、融合函式、邏輯操作、模板、紋理對映和z快取;

glBegin(GL_TRIANGLES);
函式功能:繪製圖像
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_TRIANGLES_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()之間可呼叫的函式
glVertex*() 設定頂點座標
glColor*() 設定當前顏色
glIndex*() 設定當前顏色表
glNormal*() 設定法向座標
glEvalCoord*() 產生座標
glCallList(),glCallLists() 執行顯示列表
glTexCoord*() 設定紋理座標
glEdgeFlag*() 控制邊界繪製
glMaterial*() 設定材質

OpenGL空間方位為:螢幕水平方向向右為X軸,螢幕垂直方向向上為Y軸,螢幕垂直方向向外為Z軸。
glTranslatef();glScalef();glRotatef()等介面的作用是對當前模型空間進行幾何轉換,要在呼叫glBegin()和glEnd()介面之前進行處理。
glRotatef(angle,x,y,z);
函式功能:將圖形以a(x,y,z)向量為旋轉軸旋轉angle角度,旋轉遵循右手規則。
glTranslatef(x,y,z);
函式功能:移動圖形的原點。
glScalef(x,y,z);
函式功能:模型縮放。

glutSwapBuffers();
函式功能:交換兩個緩衝區指標。

glutMainLoop();
函式功能:進入GLUT事件處理迴圈,讓所有的與“事件”有關的函式呼叫無限迴圈。