首先說一下本次Demo中用到的glut中的幾個常用函數(shù):
void glutInit(int *argcp, char **argv)
void glutInitDisplayMode(unsigned int mode)
void glutInitWindowSize(int width, int height)
int glutCreateWindow(const char *title)
void glutDisplayFunc(void (*func)(void))
void glutMainLoop(void)
void glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
void glClear (GLbitfield mask)
void glBegin (GLenum mode)
void glEnd (void)
void glFlush (void);
接下來我一一介紹這幾個函數(shù)。
void glutInit(int *argcp, char **argv):
初始化一個GLUT庫,其中兩個參數(shù),一般情況下,傳入main()函數(shù)中的兩個參數(shù)就可以了。
void glutInitDisplayMode(unsigned int mode)
設(shè)置程序所使用的窗口類型。窗口設(shè)置更多的OpenGL特性,例如RGBA顏色空間,使用深度緩存或動畫效果,模型可以取下值或者組合,其中可選標志位:。
圖片來源:百度百科

至于如何選取模型的使用場景,會在以后的學習了解中,再進行分析添加,暫時我也不清楚。)
void glutInitWindowSize(int width, int height)
這個函數(shù)從方法名上就可以了解到,設(shè)置創(chuàng)建的windows的尺寸。
int glutCreateWindow(const char *title)
如果當前的系統(tǒng)環(huán)境可以滿足glutInitDisplayMode()的顯示模式要求,就會創(chuàng)建一個窗口。只有GLUT創(chuàng)建了一個窗口,我們才可以使用OpenGL相關(guān)的函數(shù),其中的參數(shù)title,就是為窗口設(shè)置了一個名字。
void glutDisplayFunc(void (*func)(void))
參數(shù)是一個回調(diào)函數(shù),用于顯示回調(diào),即GLUT再每次更新窗口內(nèi)容的時候自動調(diào)用該函數(shù)進行繪制。
void glutMainLoop(void)
一個無限執(zhí)行的循環(huán),負責一直處理窗口和操作系統(tǒng)的用戶輸入等操作,可以類比開發(fā)iOS應(yīng)用時,在啟動程序的時候會開啟主線程中的runloop。注意:不會執(zhí)行在glutMainLoop()之后的所有命令
void glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
設(shè)置清屏顏色,僅僅是預設(shè)置顏色刷新緩沖區(qū)的顏色,必須和glClear()配合使用,才可以把顏色真正的著色到窗口上(個人理解,見諒見諒)。 在iOS、OS中,顏色成分的取值范圍為:0~1之間的浮點數(shù)。
void glClear (GLbitfield mask)
作用是用當前清除緩沖區(qū)的值,比如glClearColor()設(shè)置的顏色值,清除指定的緩沖區(qū)。
GLbitfield:可以使用 | 運算符組合不同的緩沖標志位,表明需要清除的緩沖,例如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: 模板緩沖
void glBegin (GLenum mode)
這個函數(shù)應(yīng)該和glEnd同時存在,標示渲染的開始和結(jié)束。
GLenum:表示創(chuàng)建元素的類型(幾何圖元),可選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:繪制一組相連的三角形,對于奇數(shù)n,頂點n、n+1和n+2定義了第n個三角形;對于偶數(shù)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個四邊形??偣怖L制N/4個四邊形
GL_QUAD_STRIP:繪制一組相連的四邊形。每個四邊形是由一對頂點及其后給定的一對頂點共同確定的。頂點2n-1、2n、2n+2和2n+1定義了第n個四邊形,總共繪制N/2-1個四邊形
GL_POLYGON:繪制一個凸多邊形。頂點1到n定義了這個多邊形。
函數(shù)說明:
glBegin和glEnd函數(shù)限定了一組或多組圖元的定點定義。
--------來源:百度百科

void glFlush (void)
強制刷新緩存區(qū),保證繪制命令得以執(zhí)行
簡單地說glFlush()就是強制刷新,OpenGL是使用一條渲染管線 [3] 線性處理命令的,一般情況下,我們提交給OpenGL的指令并不是馬上送到驅(qū)動程序 [4] 里執(zhí)行的,而是放到一個緩沖區(qū)里面,等這個緩沖區(qū)滿了再一次過發(fā)到驅(qū)動程序里執(zhí)行;很多時候只有幾條指令是填充不滿那個緩沖區(qū)的,就是說這些指令根本沒有被發(fā)送到驅(qū)動里,所以我們要調(diào)用glFlush來強制把這些指令送到驅(qū)動里進行處理。 ------百度百科
了解了以上內(nèi)容,我們就可以實現(xiàn)一些簡單的圖形渲染,比如下面將實現(xiàn)一個紅底綠色的三角形。
void draw()
{
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glColor3f(0.0f, 1.0f, 0.0f);
//glVertex2d:二維的笛卡爾坐標軸,設(shè)置坐標頂點,OpenGL默認坐標值只能從-1到1
glVertex2d(-0.5f, 0.0f);
glVertex2d(0.5f, 0.0f);
glVertex2d(0.0f, 0.5f);
glEnd();
glFlush();
}
int main(int argc,const char *argv[])
{
//1.初始化一個GLUT庫
glutInit(&argc, (char **)argv);
//2.創(chuàng)建一個窗口并制定窗口名
glutCreateWindow("三角形");
//3.注冊一個繪圖函數(shù),操作系統(tǒng)在必要時刻就會對窗體進行重繪制操作
//它設(shè)置了一個顯示回調(diào)(diplay callback),即GLUT在每次更新窗口內(nèi)容的時候回自動調(diào)用該例程
glutDisplayFunc(draw);
//這是一個無限執(zhí)行的循環(huán),它會負責一直處理窗口和操作系統(tǒng)的用戶輸入等操作。(注意:不會執(zhí)行在glutMainLoop()之后的所有命令。)
glutMainLoop();
return 0;
}
至此,我們就實現(xiàn)了使用OpenGL繪畫一個三角形的簡單功能,由于初次接觸,如果錯誤,深感抱歉,還請指正,謝謝。