OpenGL繪制基本流程

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

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

#include "GLShaderManager.h"

#include "GLTools.h"

#include?<GLUT/GLUT.h>

具體作用:

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

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

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

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

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

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

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)常用來(lái)生成動(dòng)畫(huà)效果;

?? ? --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ù)南?類(lèi)型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è)特殊的鍵盤(pán)響應(yīng)函數(shù)

7、

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

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

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

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

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

參數(shù)詳解參考

? ? triangleBatch.CopyVertexData3f(vVerts);

? ? triangleBatch.End();

}

\bullet 接下來(lái)需要定義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)前激活的用來(lái)進(jìn)行顏色寫(xiě)入緩沖區(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ù)來(lái)表示顏色

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) ??

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

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

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

最后編輯于
?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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