OpenGL繪制正方形

實(shí)現(xiàn)繪制正方形同辣,主要分為創(chuàng)建Main函數(shù)、設(shè)置窗口惭载、設(shè)置顯示函數(shù)旱函、設(shè)置渲染屬性、按鍵監(jiān)聽函數(shù)等五個(gè)步驟來(lái)實(shí)現(xiàn)

第一步:
首先是Main函數(shù),主要是設(shè)置監(jiān)聽窗口尺寸函數(shù)描滔、顯示函數(shù)棒妨、按鍵監(jiān)聽的改變和設(shè)置屬性setupRC(),以及開啟線程和保護(hù)線程

#include "GLShaderManager.h"
/*
`#include<GLShaderManager.h>` 移入了GLTool 著色器管理器(shader Mananger)類。沒有著色器含长,我們就不能在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
};


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_DEPTH | GLUT_STENCIL);
   
   //GLUT 窗口大小策州、窗口標(biāo)題
   glutInitWindowSize(800, 600);
   glutCreateWindow("Hello world!");

   /*
    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(SpecialKes);
   /*
    初始化一個(gè)GLEW庫(kù),確保OpenGL API對(duì)程序完全可用旁仿。
    在試圖做任何渲染之前,要檢查確定驅(qū)動(dòng)程序的初始化過(guò)程中沒有任何問(wèn)題
    */
   GLenum status = glewInit();
   if (GLEW_OK != status) {
       printf("GLEW Error: %s\n", glewGetErrorString(status));
       return 1;
   }
   
   setupRC();
   //設(shè)置我們的渲染環(huán)境
   //保護(hù)線程的運(yùn)行
   glutMainLoop();
   
   return 0;
}

第二步:窗口尺寸的監(jiān)聽回調(diào)

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

第三步:渲染函數(shù),將設(shè)置的正方體渲染出窗口上

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();
   
   
   //---------方法2--------
   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
   
   GLfloat vRed[] = {1.0f,0.0f,0.0f,0.0f};
   
   M3DMatrix44f mFinalTransform,mTransfromMatrix,mRotationMartix;
   
   //平移
   m3dTranslationMatrix44(mTransfromMatrix, xPos, yPos, 0.0f);
   
   //每次平移時(shí)饮六,旋轉(zhuǎn)5度
   static float yRot = 0.0f;
   yRot += 5.0f;
   m3dRotationMatrix44(mRotationMartix, m3dDegToRad(yRot), 0.0f, 0.0f, 1.0f);
   
   //將旋轉(zhuǎn)和移動(dòng)的矩陣結(jié)果 合并到mFinalTransform (矩陣相乘)
   m3dMatrixMultiply44(mFinalTransform, mTransfromMatrix, mRotationMartix);
   
   //將矩陣結(jié)果 提交給固定著色器(平面著色器)中繪制
   shaderManager.UseStockShader(GLT_SHADER_FLAT,mFinalTransform,vRed);
   triangleBatch.Draw();
   
   //執(zhí)行交換緩存區(qū)
   glutSwapBuffers();
   
   
}

第四步:設(shè)置基本屬性,設(shè)置頂點(diǎn)數(shù)據(jù)和顏色

void setupRC()
{
   //設(shè)置清屏顏色(背景顏色)
   glClearColor(0.98f, 0.40f, 0.7f, 1);
   
   
   //沒有著色器苛蒲,在OpenGL 核心框架中是無(wú)法進(jìn)行任何渲染的卤橄。初始化一個(gè)渲染管理器。
   //在前面的課程臂外,我們會(huì)采用固管線渲染窟扑,后面會(huì)學(xué)著用OpenGL著色語(yǔ)言來(lái)寫著色器
   shaderManager.InitializeStockShaders();
   
   //修改為GL_TRIANGLE_FAN ,4個(gè)頂點(diǎn)
   triangleBatch.Begin(GL_TRIANGLE_FAN, 4);
   triangleBatch.CopyVertexData3f(vVerts);
   triangleBatch.End();
   
}

第五步:按鍵監(jiān)聽回調(diào),通過(guò)按鍵可以移動(dòng)正方體的位置

void SpecialKeys(int key, int x, int y){
   
  
   
   GLfloat stepSize = 0.025f;
   
   if (key == GLUT_KEY_UP) {
       
       yPos += stepSize;
   }
   
   if (key == GLUT_KEY_DOWN) {
       yPos -= stepSize;
   }
   
   if (key == GLUT_KEY_LEFT) {
       xPos -= stepSize;
   }
   
   if (key == GLUT_KEY_RIGHT) {
       xPos += stepSize;
   }
   
   //碰撞檢測(cè)
   if (xPos < (-1.0f + blockSize)) {
       
       xPos = -1.0f + blockSize;
   }
   
   if (xPos > (1.0f - blockSize)) {
       xPos = 1.0f - blockSize;
   }
   
   if (yPos < (-1.0f + blockSize)) {
       yPos = -1.0f + blockSize;
   }
   
   if (yPos > (1.0f - blockSize)) {
       yPos = 1.0f - blockSize;
   }
   
   glutPostRedisplay();
   
}

到此就成功啦漏健!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嚎货,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蔫浆,更是在濱河造成了極大的恐慌殖属,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓦盛,死亡現(xiàn)場(chǎng)離奇詭異洗显,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)原环,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門挠唆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人嘱吗,你說(shuō)我怎么就攤上這事玄组。” “怎么了柜与?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵巧勤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我弄匕,道長(zhǎng)颅悉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任迁匠,我火速辦了婚禮剩瓶,結(jié)果婚禮上驹溃,老公的妹妹穿的比我還像新娘。我一直安慰自己延曙,他們只是感情好豌鹤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枝缔,像睡著了一般布疙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上愿卸,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天灵临,我揣著相機(jī)與錄音,去河邊找鬼趴荸。 笑死儒溉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的发钝。 我是一名探鬼主播顿涣,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼酝豪!你這毒婦竟也來(lái)了涛碑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤寓调,失蹤者是張志新(化名)和其女友劉穎锌唾,沒想到半個(gè)月后锄码,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夺英,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年滋捶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了痛悯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡重窟,死狀恐怖载萌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巡扇,我是刑警寧澤扭仁,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站厅翔,受9級(jí)特大地震影響乖坠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刀闷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一熊泵、第九天 我趴在偏房一處隱蔽的房頂上張望仰迁。 院中可真熱鬧,春花似錦顽分、人聲如沸徐许。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)雌隅。三九已至,卻和暖如春缸沃,著一層夾襖步出監(jiān)牢的瞬間澄步,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工和泌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留村缸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓武氓,卻偏偏與公主長(zhǎng)得像梯皿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子县恕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355