OpenGL 繪制正方形并移動(dòng)

1.代碼執(zhí)行流程


代碼展示:
include "GLShaderManager.h" :移入了GLTool 著色器管理器(shader Mananger)類酝陈。著色器管理器不僅允許我們創(chuàng)建并管理著色器立倍,還提供一組“存儲(chǔ)著色器”弥姻,他們能夠進(jìn)行一些初步?基本的渲染操作缅疟。
include<GLTools.h>:GLTool.h:頭文件包含了大部分GLTool中類似C語(yǔ)言的獨(dú)立函數(shù)
include <GLUT/GLUT.h>:在Mac 系統(tǒng)下梗顺,include<glut/glut.h>
在Windows 和 Linux上宵荒,我們使用freeglut的靜態(tài)庫(kù)版本并且需要添加一個(gè)宏

#include "GLShaderManager.h"
/*
 `#include<GLShaderManager.h>` 移入了GLTool 著色器管理器(shader Mananger)類采郎。沒(méi)有著色器懂昂,我們就不能在OpenGL(核心框架)進(jìn)行著色介时。著色器管理器不僅允許我們創(chuàng)建并管理著色器,還提供一組“存儲(chǔ)著色器”凌彬,他們能夠進(jìn)行一些初步?基本的渲染操作沸柔。
 */

#include "GLTools.h"
/*
 `#include<GLTools.h>`  GLTool.h頭文件包含了大部分GLTool中類似C語(yǔ)言的獨(dú)立函數(shù)
*/

 
#include <GLUT/GLUT.h>
/*
 在Mac 系統(tǒng)下,`#include<glut/glut.h>`
 在Windows 和 Linux上铲敛,我們使用freeglut的靜態(tài)庫(kù)版本并且需要添加一個(gè)宏
*/

//定義一個(gè)褐澎,著色管理器
GLShaderManager shaderManager;

//簡(jiǎn)單的批次容器,是GLTools的一個(gè)簡(jiǎn)單的容器類伐蒋。
GLBatch triangleBatch;


//blockSize 邊長(zhǎng)
GLfloat blockSize = 0.1f;

//正方形的4個(gè)點(diǎn)坐標(biāo)
GLfloat vVerts[] = {
        -blockSize,-blockSize,0.0f,
        blockSize,-blockSize,0.0f,
        blockSize,blockSize,0.0f,
        -blockSize,blockSize,0.0f
};

2.自定義函數(shù)
changeSize:在窗口大小改變時(shí)工三,接收新的寬度&高度迁酸。


void changeSize(int w,int h)
{
    /*
      x,y 參數(shù)代表窗口中視圖的左下角坐標(biāo),而寬度俭正、高度是像素為表示奸鬓,通常x,y 都是為0
     */
    glViewport(0, 0, w, h);
    
}

RenderScene:系統(tǒng)觸發(fā)或手動(dòng)調(diào)用渲染時(shí)調(diào)用
1.清除一個(gè)或者一組特定的緩存區(qū)
2.設(shè)置背景色傳遞到存儲(chǔ)著色器
將后臺(tái)緩沖區(qū)進(jìn)行渲染,然后結(jié)束后交換給前臺(tái)

void RenderScene(void)
{

    //1.清除一個(gè)或者一組特定的緩存區(qū)
    /*
     緩沖區(qū)是一塊存在圖像信息的儲(chǔ)存空間掸读,紅色串远、綠色、藍(lán)色和alpha分量通常一起分量通常一起作為顏色緩存區(qū)或像素緩存區(qū)引用儿惫。
     OpenGL 中不止一種緩沖區(qū)(顏色緩存區(qū)澡罚、深度緩存區(qū)和模板緩存區(qū))
      清除緩存區(qū)對(duì)數(shù)值進(jìn)行預(yù)置
     參數(shù):指定將要清除的緩存的
     GL_COLOR_BUFFER_BIT :指示當(dāng)前激活的用來(lái)進(jìn)行顏色寫入緩沖區(qū)
     GL_DEPTH_BUFFER_BIT :指示深度緩存區(qū)
     GL_STENCIL_BUFFER_BIT:指示模板緩沖區(qū)
     */
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
    
    
    //2.設(shè)置一組浮點(diǎn)數(shù)來(lái)表示紅色
    GLfloat vRed[] = {1.0,0.0,0.0,1.0f};
    
    //傳遞到存儲(chǔ)著色器,即GLT_SHADER_IDENTITY著色器肾请,這個(gè)著色器只是使用指定顏色以默認(rèn)笛卡爾坐標(biāo)第在屏幕上渲染幾何圖形
    shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
    
    //提交著色器
    triangleBatch.Draw();
    
    //在開始的設(shè)置openGL 窗口的時(shí)候留搔,我們指定要一個(gè)雙緩沖區(qū)的渲染環(huán)境。這就意味著將在后臺(tái)緩沖區(qū)進(jìn)行渲染筐喳,渲染結(jié)束后交換給前臺(tái)催式。這種方式可以防止觀察者看到可能伴隨著動(dòng)畫幀與動(dòng)畫幀之間的閃爍的渲染過(guò)程函喉。緩沖區(qū)交換平臺(tái)將以平臺(tái)特定的方式進(jìn)行避归。
    //將后臺(tái)緩沖區(qū)進(jìn)行渲染,然后結(jié)束后交換給前臺(tái)
    glutSwapBuffers();
    
}

setupRC:main函數(shù)手動(dòng)調(diào)用管呵,設(shè)置清屏顏色(背景顏色)梳毙,初始化一個(gè)渲染管理器。指定頂點(diǎn)

void setupRC()
{
    //設(shè)置清屏顏色(背景顏色)
    glClearColor(0.98f, 0.40f, 0.7f, 1);
    
    
    //沒(méi)有著色器捐下,在OpenGL 核心框架中是無(wú)法進(jìn)行任何渲染的账锹。初始化一個(gè)渲染管理器。
    //在前面的課程坷襟,我們會(huì)采用固管線渲染奸柬,后面會(huì)學(xué)著用OpenGL著色語(yǔ)言來(lái)寫著色器
    shaderManager.InitializeStockShaders();
    
    
//    //指定頂點(diǎn)
//    //在OpenGL中,三角形是一種基本的3D圖元繪圖原素婴程。
//    GLfloat vVerts[] = {
//        -0.5f,0.0f,0.0f,
//        0.5f,0.0f,0.0f,
//        0.0f,0.5f,0.0f
//    };
    
    //修改為GL_TRIANGLE_FAN 廓奕,4個(gè)頂點(diǎn)
    triangleBatch.Begin(GL_TRIANGLE_FAN, 4);
    triangleBatch.CopyVertexData3f(vVerts);
    triangleBatch.End();
    
}

SpecialKeys:用戶點(diǎn)擊特殊鍵位時(shí)調(diào)用,進(jìn)行頂點(diǎn)更新档叔,邊界處理

void SpecialKeys(int key, int x, int y){
    
    GLfloat stepSize = 0.025f;
    
    GLfloat blockX = vVerts[0];
    GLfloat blockY = vVerts[10];
    
    printf("v[0] = %f\n",blockX);
    printf("v[10] = %f\n",blockY);
    
    
    if (key == GLUT_KEY_UP) {
        
        blockY += stepSize;
    }
    
    if (key == GLUT_KEY_DOWN) {
        
        blockY -= stepSize;
    }
    
    if (key == GLUT_KEY_LEFT) {
        blockX -= stepSize;
    }
    
    if (key == GLUT_KEY_RIGHT) {
        blockX += stepSize;
    }

    //觸碰到邊界(4個(gè)邊界)的處理
    
    //當(dāng)正方形移動(dòng)超過(guò)最左邊的時(shí)候
    if (blockX < -1.0f) {
        blockX = -1.0f;
    }
    
    //當(dāng)正方形移動(dòng)到最右邊時(shí)
    //1.0 - blockSize * 2 = 總邊長(zhǎng) - 正方形的邊長(zhǎng) = 最左邊點(diǎn)的位置
    if (blockX > (1.0 - blockSize * 2)) {
        blockX = 1.0f - blockSize * 2;
    }
    
    //當(dāng)正方形移動(dòng)到最下面時(shí)
    //-1.0 - blockSize * 2 = Y(負(fù)軸邊界) - 正方形邊長(zhǎng) = 最下面點(diǎn)的位置
    if (blockY < -1.0f + blockSize * 2 ) {
        
        blockY = -1.0f + blockSize * 2;
    }
    
    //當(dāng)正方形移動(dòng)到最上面時(shí)
    if (blockY > 1.0f) {
        
        blockY = 1.0f;
        
    }

    printf("blockX = %f\n",blockX);
    printf("blockY = %f\n",blockY);
    
    // Recalculate vertex positions
    vVerts[0] = blockX;
    vVerts[1] = blockY - blockSize*2;
    printf("(%f,%f)\n",vVerts[0],vVerts[1]);
    
    vVerts[3] = blockX + blockSize*2;
    vVerts[4] = blockY - blockSize*2;
    printf("(%f,%f)\n",vVerts[3],vVerts[4]);
    
    vVerts[6] = blockX + blockSize*2;
    vVerts[7] = blockY;
    printf("(%f,%f)\n",vVerts[6],vVerts[7]);
    
    vVerts[9] = blockX;
    vVerts[10] = blockY;
    printf("(%f,%f)\n",vVerts[9],vVerts[10]);
    
    triangleBatch.CopyVertexData3f(vVerts);
    
    glutPostRedisplay();
}

main函數(shù)

int main(int argc,char *argv[])
{
    //設(shè)置當(dāng)前工作目錄桌粉,針對(duì)MAC OS X
    /*
     `GLTools`函數(shù)`glSetWorkingDrectory`用來(lái)設(shè)置當(dāng)前工作目錄。實(shí)際上在Windows中是不必要的衙四,因?yàn)楣ぷ髂夸浤J(rèn)就是與程序可執(zhí)行執(zhí)行程序相同的目錄铃肯。但是在Mac OS X中,這個(gè)程序?qū)?dāng)前工作文件夾改為應(yīng)用程序捆綁包中的`/Resource`文件夾传蹈。`GLUT`的優(yōu)先設(shè)定自動(dòng)進(jìn)行了這個(gè)中設(shè)置押逼,但是這樣中方法更加安全步藕。
     */
    gltSetWorkingDirectory(argv[0]);
    
    
    //初始化GLUT庫(kù),這個(gè)函數(shù)只是傳說(shuō)命令參數(shù)并且初始化glut庫(kù)
    glutInit(&argc, argv);
    
    /*
     初始化雙緩沖窗口,其中標(biāo)志GLUT_DOUBLE挑格、GLUT_RGBA漱抓、GLUT_DEPTH、GLUT_STENCIL分別指
     雙緩沖窗口恕齐、RGBA顏色模式乞娄、深度測(cè)試、模板緩沖區(qū)
     
     --GLUT_DOUBLE`:雙緩存窗口显歧,是指繪圖命令實(shí)際上是離屏緩存區(qū)執(zhí)行的仪或,然后迅速轉(zhuǎn)換成窗口視圖,這種方式士骤,經(jīng)常用來(lái)生成動(dòng)畫效果范删;
     --GLUT_DEPTH`:標(biāo)志將一個(gè)深度緩存區(qū)分配為顯示的一部分,因此我們能夠執(zhí)行深度測(cè)試拷肌;
     --GLUT_STENCIL`:確保我們也會(huì)有一個(gè)可用的模板緩存區(qū)到旦。
     深度、模板測(cè)試后面會(huì)細(xì)致講到
     */
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
    
    //GLUT窗口大小巨缘、窗口標(biāo)題
    //glutInitWindowSize(600, 800);
    glutInitWindowSize(500, 500);
    glutCreateWindow("Triangle");
    
    /*
     GLUT 內(nèi)部運(yùn)行一個(gè)本地消息循環(huán)添忘,攔截適當(dāng)?shù)南ⅰH缓笳{(diào)用我們不同時(shí)間注冊(cè)的回調(diào)函數(shù)若锁。我們一共注冊(cè)2個(gè)回調(diào)函數(shù):
     1)為窗口改變大小而設(shè)置的一個(gè)回調(diào)函數(shù)
     2)包含OpenGL 渲染的回調(diào)函數(shù)
     */
    //注冊(cè)重塑函數(shù)
    glutReshapeFunc(changeSize);
    //注冊(cè)顯示函數(shù)
    glutDisplayFunc(RenderScene);

    //注冊(cè)特殊函數(shù)
   glutSpecialFunc(SpecialKeys);
    
    
    
    /*
     初始化一個(gè)GLEW庫(kù),確保OpenGL API對(duì)程序完全可用搁骑。
     在試圖做任何渲染之前,要檢查確定驅(qū)動(dòng)程序的初始化過(guò)程中沒(méi)有任何問(wèn)題
     */
    GLenum status = glewInit();
    if (GLEW_OK != status) {
        
        printf("GLEW Error:%s\n",glewGetErrorString(status));
        return 1;
        
    }
    
    //設(shè)置我們的渲染環(huán)境
    setupRC();
    
    glutMainLoop();
    


    
    return  0;
    
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末又固,一起剝皮案震驚了整個(gè)濱河市仲器,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仰冠,老刑警劉巖乏冀,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異洋只,居然都是意外死亡辆沦,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門木张,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)众辨,“玉大人,你說(shuō)我怎么就攤上這事舷礼【槌梗” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵妻献,是天一觀的道長(zhǎng)蛛株。 經(jīng)常有香客問(wèn)我团赁,道長(zhǎng),這世上最難降的妖魔是什么谨履? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任欢摄,我火速辦了婚禮,結(jié)果婚禮上笋粟,老公的妹妹穿的比我還像新娘怀挠。我一直安慰自己,他們只是感情好害捕,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布绿淋。 她就那樣靜靜地躺著,像睡著了一般尝盼。 火紅的嫁衣襯著肌膚如雪吞滞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天盾沫,我揣著相機(jī)與錄音裁赠,去河邊找鬼。 笑死赴精,一個(gè)胖子當(dāng)著我的面吹牛佩捞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播祖娘,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼失尖,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼啊奄!你這毒婦竟也來(lái)了渐苏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤菇夸,失蹤者是張志新(化名)和其女友劉穎琼富,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庄新,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鞠眉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了择诈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片械蹋。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖羞芍,靈堂內(nèi)的尸體忽然破棺而出哗戈,到底是詐尸還是另有隱情,我是刑警寧澤荷科,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布唯咬,位于F島的核電站纱注,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏胆胰。R本人自食惡果不足惜狞贱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜀涨。 院中可真熱鬧瞎嬉,春花似錦、人聲如沸厚柳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)草娜。三九已至挑胸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宰闰,已是汗流浹背茬贵。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留移袍,地道東北人解藻。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像葡盗,于是被迫代替她去往敵國(guó)和親螟左。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345