首先,我們需要搭建一個(gè)基本的窗口
1. 初始化glut模塊
glutInit(&argc, argv);
2. 加載配置模塊
? 需要加載的有
GLUT_DOUBLE 雙緩沖窗口
GLUT_RGBA RGBA顏色模式(后面嘗試一下能否家在HSV顏色模式)
GLUT_DEPTH 深度測(cè)試模塊
-
GLUT_STENCIL 模版緩沖區(qū)
/** * GLUT_DOUBLE 雙緩沖窗口 是指繪圖命令實(shí)際上是離屏緩存區(qū)執(zhí)行的,然后迅速轉(zhuǎn)換成窗口視圖漓摩,這種方式經(jīng)常用來生成動(dòng)畫效果 * GLUT_RGBA RGBA顏色模式 RGBA通道,R G B A 的范圍分別為 0-1 * GLUT_DEPTH 深度測(cè)試 標(biāo)志將一個(gè)深度緩存區(qū)分配為顯示的一部分,因此我們能夠執(zhí)行深度測(cè)試 * GLUT_STENCIL 模版緩沖區(qū) 確保有一個(gè)可用的模版緩沖區(qū) */ glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
3.設(shè)置窗口大小 (后面的視口大小盡量與視圖大小一致)
glutInitWindowSize(600, 400);
4.給這個(gè)窗口取個(gè)名字并創(chuàng)建這個(gè)窗口
glutCreateWindow("Triangle");
5.設(shè)置一個(gè)方法蜒什,用于捕獲窗口改變時(shí)的消息
/**
* @param w 捕獲到的寬度
* @param h 捕獲到的的高度
*/
void ChangeSize(int w, int h)
{
}
glutReshapeFunc(ChangeSize);
6.注冊(cè)一個(gè)方法,用于設(shè)置顯示的內(nèi)容(屏幕刷新的時(shí)候)
void RenderScene(void)
{
}
glutDisplayFunc(RenderScene);
7.初始化GLEW庫疤估,并檢查驅(qū)動(dòng)初始化過程中是否出現(xiàn)問題灾常,以確保OpenGL API是完整的,可用的
GLenum status = glewInit();
if (status != GLEW_OK) {
printf("GLEW Occur an error: %s \n", glewGetErrorString(status));
return 1;
}
8.設(shè)置渲染環(huán)境(準(zhǔn)備工作)
void SetupRC()
{
}
SetupRC();
9.加載并啟動(dòng)MainLoop配置
glutMainLoop();
至此铃拇,基本窗口就搭建完畢了钞瀑,接下來開始寫窗口內(nèi)的內(nèi)容
接下來,配置一下窗口大小發(fā)生變化時(shí)的操作
void ChangeSize(int w, int h)
{
glViewport(0, 0, w, h)
}
當(dāng)初始化窗口或拉動(dòng)窗口邊界改變窗口大小時(shí)慷荔,將窗口大小改變?yōu)槌跏蓟拇笮』蚶瓌?dòng)到的大小雕什,如果不設(shè)置這一步的話,
然后進(jìn)行繪制的準(zhǔn)備
-
設(shè)置畫板的背景顏色
//設(shè)置成了水藍(lán)色 glClearColor(212/255.0, 242/255.0, 231/255.0, 1);
-
創(chuàng)建一個(gè)全局的著色器显晶,用來繪制圖案贷岸,并初始化
GLShaderManager shaderManager; shaderManager.InitializeStockShaders()
-
設(shè)置圖形頂點(diǎn)數(shù)據(jù)
GLfloat vTops[] = { -0.4, -0.3, 0, 0.6, -0.7, 0, 0.2, 0.5, 0 };
-
創(chuàng)建一個(gè)全局容器,用來描繪路徑
GLBatch triangleBatch;
-
設(shè)置繪制方式與繪制頂點(diǎn)個(gè)數(shù)磷雇,并將頂點(diǎn)數(shù)據(jù)拷貝進(jìn)容器內(nèi)
/** * GL_TRIANGLES 三角形 */ triangleBatch.Begin(GL_TRIANGLES, 3); triangleBatch.CopyVertexData3f(vTops);
-
發(fā)送準(zhǔn)備結(jié)束的信號(hào)偿警,進(jìn)入繪圖階段
triangleBatch.End();
最后開始畫圖
-
清空緩沖區(qū)(可能保留有之前的狀態(tài),需要清空)
/** * GL_COLOR_BUFFER_BIT 顏色緩沖區(qū) * GL_DEPTH_BUFFER_BIT 深度緩沖區(qū) * GL_STENCIL_BUFFER_BIT 模版緩沖區(qū) */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );
-
選中著色器(就像ps那樣)唯笙,并著色器的屬性(主要是設(shè)置顏色)
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vPencil);
-
調(diào)用開始繪制的命令螟蒸,并切換顯示器的緩沖區(qū)(現(xiàn)在一般的顯示器都是雙緩沖區(qū),在顯示的時(shí)候會(huì)進(jìn)行新的繪制崩掘,繪制完畢后會(huì)顯示這次的繪制七嫌,并切換緩沖區(qū)并進(jìn)行新的繪制)
triangleBatch.Draw(); glutSwapBuffers();
這個(gè)時(shí)候,三角形就出現(xiàn)在屏幕上啦 ???????? Nice Job~