心得:
1.邊長為窗口的多少倍2. 按照步驟來渲染視圖3.第一次寫所以備注比較多4.對(duì)很多專業(yè)名詞不熟悉
下次繼續(xù)努力 感覺還是有進(jìn)步的~~~~~~
1.類文件介紹
1.
/*
`#include<GLTools.h>`?
GLTool.h頭文件包含了大部分GLTool中類似C語言的獨(dú)立函數(shù)*/
2.
/*
`#include<GLShaderManager.h>`
移入了GLTool 著色器管理器(shader Mananger)類。沒有著色器,我們就不能在OpenGL(核心框架)進(jìn)行著色。著色器管理器不僅允許我們創(chuàng)建并管理著色器,還提供一組“存儲(chǔ)著色器”,他們能夠進(jìn)行一些初步?基本的渲染操作。
*/
3.
/*
#include <GLUT/GLUT.h>
在Mac 系統(tǒng)下,`#include<glut/glut.h>`
在Windows 和 Linux上,我們使用freeglut的靜態(tài)庫版本并且需要添加一個(gè)宏
*/
2. 全局變量
//定義一個(gè)著色器管理器
GLShaderManager shareManager;
// 定義一個(gè)批次容器 包含在CLTools的簡單容器
GLBatch triangBatch;
3.main函數(shù)
1.//設(shè)置當(dāng)前工作目錄,針對(duì)MAC OS X
? ? /*
? ? `GLTools`函數(shù)`glSetWorkingDrectory`用來設(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]);
2.初始化GLUT庫,這個(gè)函數(shù)只是傳說命令參數(shù)并且初始化glut庫(數(shù)學(xué)函數(shù))
??? glutInit(&argc,argv);
3.初始化雙緩沖窗口(雙緩沖窗口、RGBA顏色模式、深度測試、模板緩沖區(qū))
? ? /*
? ? ? --GLUT_DOUBLE`:雙緩存窗口,是指繪圖命令實(shí)際上是離屏緩存區(qū)執(zhí)行的,然后迅速轉(zhuǎn)換成窗口視圖,這種方式,經(jīng)常用來生成動(dòng)畫效果;
? ? ? --GLUT_DEPTH`:標(biāo)志將一個(gè)深度緩存區(qū)分配為顯示的一部分,因此我們能夠執(zhí)行深度測試;
? ? ? --GLUT_STENCIL`:確保我們也會(huì)有一個(gè)可用的模板緩存區(qū)。
? ? ? 深度、模板測試后面會(huì)細(xì)致講到
? ? ? */
? ? glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH|GLUT_STENCIL);
? 4.初始化窗口 GLUT窗口大小、窗口標(biāo)題
??? glutInitWindowSize(500, 500);
??? glutCreateWindow("三角形");
/*5. 注冊函數(shù)
? ? GLUT 內(nèi)部運(yùn)行一個(gè)本地消息循環(huán),攔截適當(dāng)?shù)南?。然后調(diào)用我們不同時(shí)間注冊的回調(diào)函數(shù)。我們一共注冊2個(gè)回調(diào)函數(shù):
? ? 1)為窗口改變大小而設(shè)置的一個(gè)回調(diào)函數(shù)
? ? 2)包含OpenGL 渲染的回調(diào)函數(shù)
? ? */
? ? //注冊重塑函數(shù)
? ? glutReshapeFunc(changeSize);
? ? //注冊顯示函數(shù)
? ? glutDisplayFunc(renderScene);
? ? //注冊特殊函數(shù) (鍵盤輸入)
? ? glutSpecialFunc(specialKeys);
??? /*補(bǔ)充
???? 初始化一個(gè)GLEW庫,確保OpenGL API對(duì)程序完全可用。
???? 在視圖做任何渲染之前,要檢查確定驅(qū)動(dòng)程序的初始化過程中沒有任何問題
???? */
??? GLenum status = glewInit();
??? if (GLEW_OK != status) {
???????
??????? printf("OpenGL API Error:%s\n",glewGetErrorString(status));
??????? return 1;
??? }
??? 6.設(shè)置我們的渲染環(huán)境
??? setRec();
??? 7.讓所有的與“事件”有關(guān)的函數(shù)調(diào)用無限循環(huán)
??? glutMainLoop();
4.changeSize
?窗口視圖發(fā)生改變調(diào)用
??? /*
????? x,y 參數(shù)代表窗口中視圖的左下角坐標(biāo),而寬度、高度是像素為表示,通常x,y 都是為0
???? */
??? glViewport(0, 0, w, h);
5.renderScene
??? //1.清除一個(gè)或者一組特定的緩存區(qū)
??? /*
???GLbitfield:可以使用 | 運(yùn)算符組合不同的緩沖標(biāo)志位,表明需要清除的緩沖
???? 緩沖區(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)前激活的用來進(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án))
? ? GLfloat vRed[] = {1.0,0.0,0.0,1.0f};
? /*
? ? GLShaderManager::UseStockShader(GLT_SHADER_IDENTITY,GLfloat vColor[4]);
? ? 參數(shù)1:存儲(chǔ)著色器種類
? ? ? ? 單位著色器/單元著色器: GLT_SHADER_IDENTITY
? ? ? ? 平面著色器:GLT_SHADER_FLAT
? ? ? ? 上色著色器:GLT_SHADER_SHADED
? ? ? ? 默認(rèn)光源著色器:GLT_SHADER_DEFAULT_LIGHT
? ? ? ? 點(diǎn)光源著色器:GLT_SHADER_POINT_LIGHT_DIFF
? ? ? ? 紋理替換矩陣著色器:GLT_SHADER_TEXTURE_REPLACE
? ? ? ? 紋理調(diào)整著色器:GLT_SHADER_TEXTURE_MODULATE
? ? ? ? 紋理光源著色器:GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF
? ? 參數(shù)2:顏色
? ? 使用場景:
? ? ? ? 單位著色器只是簡單的使用默認(rèn)的笛卡爾坐標(biāo)系。
? ? ? ? 所有片段都應(yīng)用同一顏色,幾何圖形為實(shí)心和未渲染的。
? ? */
? ? shareManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
? ? //3.提交著色器
? ? triangBatch.Draw();
? ? //4.在開始的設(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)行。
? ? //將后臺(tái)緩沖區(qū)進(jìn)行渲染,然后結(jié)束后交換給前臺(tái)
? ? glutSwapBuffers();
6.setRec
//1.設(shè)置清屏顏色(背景顏色)
? ? glClearColor(0.98f, 0.40f, 0.7f,.5);
? ? //2.沒有著色器,在OpenGL 核心框架中是無法進(jìn)行任何渲染的。初始化一個(gè)渲染管理器。
? ? //在前面的課程,我們會(huì)采用固管線渲染,后面會(huì)學(xué)著用OpenGL著色語言來寫著色器-------z備注
? ? shareManager.InitializeStockShaders();
? ? //3.修改為GL_TRIANGLE_FAN(繪制類型) ,4個(gè)頂點(diǎn)
? ? triangBatch.Begin(GL_TRIANGLE_FAN, 4);
? ? triangBatch.CopyVertexData3f(vVerts);//邊長為窗口的多少倍
? ? triangBatch.End();
7.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)超過最左邊的時(shí)候
? ? if (blockX < -1.0f) {
? ? ? ? blockX = -1.0f;
? ? }
? ? //當(dāng)正方形移動(dòng)到最右邊時(shí)
? ? //1.0 - blockSize * 2 = 總邊長 - 正方形的邊長 = 最左邊點(diǎn)的位置
? ? if (blockX > (1.0 - blockSize * 2)) {
? ? ? ? blockX = 1.0f - blockSize * 2;
? ? }
? ? //當(dāng)正方形移動(dòng)到最下面時(shí)
? ? //-1.0 - blockSize * 2 = Y(負(fù)軸邊界) - 正方形邊長 = 最下面點(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]);
? ? triangBatch.CopyVertexData3f(vVerts);
? ? glutPostRedisplay();
}