OpenGL繪制基本流程

環(huán)境搭建以及需要引入包 參考:OpenGL環(huán)境搭建

\bullet 引入相關(guān)資源

#include "GLShaderManager.h"

#include "GLTools.h"

#include?<GLUT/GLUT.h>

具體作用:

GLShaderManager.h哺壶,引入了GLTool著色管理器,沒有著色管理器,就不能在OpenGL(核心框架)著色。著色管理器不僅允許我們創(chuàng)建并管理著色器,還提供一組'存儲(chǔ)著色器'他們能夠進(jìn)行一些基本渲染操作

GLTools.h 包含大部分GLTool中類似C語言的獨(dú)立函數(shù)

GLUT/GLUT.h??GLUT百科 ??

\bullet 要使用OpenGL和大多數(shù)工具一樣详恼,也需要進(jìn)行一系列的初始化工作

1、gltSetWorkingDirectory(argv[0]); ?//設(shè)置當(dāng)前工作目錄?

2、glutInit(&argc, argv); //初始化GLUT庫

3媚创、glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);

//初始化雙緩沖窗口

????其中標(biāo)志GLUT_DOUBLE、GLUT_RGBA彤恶、GLUT_DEPTH钞钙、GLUT_STENCIL分別指:雙緩沖窗口鳄橘、RGBA顏色模式、深度測(cè)試芒炼、模板緩沖區(qū)

?? ? --GLUT_DOUBLE:雙緩存窗口瘫怜,是指繪圖命令實(shí)際上是離屏緩存區(qū)執(zhí)行的,然后迅速轉(zhuǎn)換成窗口視圖焕议,這種方式宝磨,經(jīng)常用來生成動(dòng)畫效果;

?? ? --GLUT_DEPTH:標(biāo)志將一個(gè)深度緩存區(qū)分配為顯示的一部分盅安,因此能夠執(zhí)行深度測(cè)試唤锉;

?? ? --GLUT_STENCIL:確保有一個(gè)可用的模板緩存區(qū)。

4别瞭、glutInitWindowSize(800, 600); //設(shè)置顯示窗口大小

5窿祥、glutCreateWindow("Square"); //窗口標(biāo)題

6、注冊(cè)一些callback函數(shù)蝙寨,當(dāng)對(duì)應(yīng)的事件發(fā)生的時(shí)候晒衩,會(huì)自動(dòng)調(diào)用到相應(yīng)的函數(shù)中

GULT內(nèi)部也運(yùn)行著一個(gè)本地消息循環(huán),攔截適當(dāng)?shù)南?類型iOS中的Runloop)墙歪;然后調(diào)用注冊(cè)的相關(guān)回調(diào)函數(shù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

支持的回調(diào)事件

/*設(shè)定響應(yīng)函數(shù)*/

glutReshapeFunc(changeSize); //調(diào)整窗口大小變化時(shí)的響應(yīng)函數(shù)

glutDisplayFunc(RenderScene);?//顯示輸出函數(shù)听系。主要是opengl的繪制

glutSpecialFunc(SpecialKeys); ??//注冊(cè)特殊的鍵盤響應(yīng)函數(shù)

7、

初始化一個(gè)GLEW庫,確保OpenGL API對(duì)程序完全可用虹菲。

在試圖做任何渲染之前靠胜,要檢查確定驅(qū)動(dòng)程序的初始化過程中沒有任何問題

GLenumstatus =glewInit();

if(GLEW_OK!= status) {

? ? ? ? printf("GLEW Error:%s\n",glewGetErrorString(status));

? ? ? ? return1;

}

8、setupRC(); //設(shè)置渲染環(huán)境

9毕源、glutMainLoop(); //進(jìn)入循環(huán)浪漠,等待輸入,觸發(fā)相應(yīng)的響應(yīng)

\bullet 設(shè)置渲染環(huán)境

void setupRC(){

? ? glClearColor(0.98f, 0.40f, 0.7f, 1); //設(shè)置清屏顏色(背景顏色)

? ? shaderManager.InitializeStockShaders();

?沒有著色器霎褐,在OpenGL 核心框架中是無法進(jìn)行任何渲染的址愿。初始化一個(gè)渲染管理器。

? ? triangleBatch.Begin(GL_TRIANGLE_FAN, 4); //修改為GL_TRIANGLE_FAN 冻璃,4個(gè)頂點(diǎn)

參數(shù)詳解參考

? ? triangleBatch.CopyVertexData3f(vVerts);

? ? triangleBatch.End();

}

\bullet 接下來需要定義callback響應(yīng)函數(shù)

1响谓、調(diào)整窗口大小變化時(shí)的響應(yīng)函數(shù)?changeSize

在changeSize中調(diào)用 glViewPort函數(shù),作用:視口轉(zhuǎn)化 省艳,將標(biāo)準(zhǔn)的設(shè)備坐標(biāo)轉(zhuǎn)換為當(dāng)前屏幕坐標(biāo)

2歌粥、顯示輸出函數(shù)。主要是opengl的繪制 ?RenderScene

1.?glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT); ?//清除緩沖區(qū)

緩沖區(qū)是一塊存在圖像信息的儲(chǔ)存空間拍埠,紅色失驶、綠色、藍(lán)色和alpha分量通常一起分量通常一起作為顏色緩存區(qū)或像素緩存區(qū)引用枣购。 ?? ?

OpenGL 中不止一種緩沖區(qū)(包括:顏色緩存區(qū)嬉探、深度緩存區(qū)和模板緩存區(qū)) ? ? ?

預(yù)置參數(shù):

GL_COLOR_BUFFER_BIT :指示當(dāng)前激活的用來進(jìn)行顏色寫入緩沖區(qū) ?? ? GL_DEPTH_BUFFER_BIT :指示深度緩存區(qū) ? ? ????????????????????????????????GL_STENCIL_BUFFER_BIT:指示模板緩沖區(qū) ? ? ?

2. GLfloat vRed[] = {1.0,0.0,0.0,1.0f}; ?//設(shè)置一組浮點(diǎn)數(shù)來表示顏色

3. shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed); ? ?//傳遞到存儲(chǔ)著色器擦耀,即GLT_SHADER_IDENTITY著色器,這個(gè)著色器只是使用指定顏色以默認(rèn)笛卡爾坐標(biāo)第在屏幕上渲染幾何圖形 ??

4. triangleBatch.Draw(); ? ? ? ?//提交著色器 ? ?

5.glutSwapBuffers(); ? //將后臺(tái)緩沖區(qū)進(jìn)行渲染涩堤,然后結(jié)束后交換給前臺(tái) ??

在開始設(shè)置openGL 窗口的時(shí)候眷蜓,我們指定要一個(gè)雙緩沖區(qū)的渲染環(huán)境。這就意味著將在后臺(tái)緩沖區(qū)進(jìn)行渲染胎围,渲染結(jié)束后交換給前臺(tái)吁系。這種方式可以防止觀察者看到可能伴隨著動(dòng)畫幀與動(dòng)畫幀之間的閃爍的渲染過程。緩沖區(qū)交換平臺(tái)將以平臺(tái)特定的方式進(jìn)行白魂。 ? ??

3汽纤、特殊的鍵盤響應(yīng)函數(shù)?SpecialKeys

Demo對(duì)應(yīng)鏈接地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市福荸,隨后出現(xiàn)的幾起案子蕴坪,更是在濱河造成了極大的恐慌,老刑警劉巖敬锐,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件背传,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡台夺,警方通過查閱死者的電腦和手機(jī)径玖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颤介,“玉大人挺狰,你說我怎么就攤上這事÷蚩撸” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵薯定,是天一觀的道長(zhǎng)始绍。 經(jīng)常有香客問我,道長(zhǎng)话侄,這世上最難降的妖魔是什么亏推? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮年堆,結(jié)果婚禮上吞杭,老公的妹妹穿的比我還像新娘。我一直安慰自己变丧,他們只是感情好芽狗,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著痒蓬,像睡著了一般童擎。 火紅的嫁衣襯著肌膚如雪滴劲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天顾复,我揣著相機(jī)與錄音班挖,去河邊找鬼。 笑死芯砸,一個(gè)胖子當(dāng)著我的面吹牛萧芙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播假丧,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼双揪,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了虎谢?” 一聲冷哼從身側(cè)響起盟榴,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎婴噩,沒想到半個(gè)月后擎场,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡几莽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年耸成,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姻报。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜻懦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纤垂,到底是詐尸還是另有隱情矾策,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布峭沦,位于F島的核電站贾虽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏吼鱼。R本人自食惡果不足惜蓬豁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望菇肃。 院中可真熱鬧地粪,春花似錦、人聲如沸琐谤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至付魔,卻和暖如春聊品,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背几苍。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工翻屈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人妻坝。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓伸眶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親刽宪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子厘贼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360