初識OpenGL_01

首先說一下本次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顏色空間,使用深度緩存或動畫效果,模型可以取下值或者組合,其中可選標志位:。
圖片來源:百度百科

窗口類型表.png
至于如何選取模型的使用場景,會在以后的學習了解中,再進行分析添加,暫時我也不清楚。)

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繪畫一個三角形的簡單功能,由于初次接觸,如果錯誤,深感抱歉,還請指正,謝謝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容