OpenGL 第二課 : 第一個(gè)應(yīng)用程序!


心得:

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();


}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容