環(huán)境搭建以及需要引入包 參考:OpenGL環(huán)境搭建
引入相關(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百科 ??
要使用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ù) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
/*設(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)
設(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)
? ? triangleBatch.CopyVertexData3f(vVerts);
? ? triangleBatch.End();
}
接下來需要定義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