案例效果先擺上Demo的github地址
三大函數(shù)
1葛碧、ChangeSize函數(shù):主要是設(shè)置視口及投影方式冒萄,當(dāng)視口發(fā)生變化當(dāng)時(shí)候時(shí)會(huì)調(diào)用
案例中設(shè)置視口代碼示例:
glViewport(0, 0, w, h);
案例中設(shè)置投影方式代碼示例:
viewFrustum.SetPerspective(35.0f, float(w) / float(h), 1.0f, 500.0f);
案例中完整代碼
// 使用窗口維度設(shè)置視口和投影矩陣.
void ChangeSize(int w, int h)
{
glViewport(0, 0, w, h);
//創(chuàng)建投影矩陣窖逗,并將它載入投影矩陣堆棧中
viewFrustum.SetPerspective(35.0f, float(w) / float(h), 1.0f, 500.0f);
projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
//調(diào)用頂部載入單元矩陣
modelViewMatrix.LoadIdentity();
}
2既琴、SetupRC函數(shù):初始化函數(shù)顷蟀,圖形數(shù)據(jù)配置丐膝,主要是頂點(diǎn)數(shù)據(jù)及圖元連接方式
// 此函數(shù)在呈現(xiàn)上下文中進(jìn)行任何必要的初始化捐友。.
// 這是第一次做任何與opengl相關(guān)的任務(wù)淫半。
void SetupRC()
{
// 灰色的背景
glClearColor(0.5f, 0.7f, 0.5f, 1.0f );
shaderManager.InitializeStockShaders();
glEnable(GL_DEPTH_TEST);
//設(shè)置變換管線以使用兩個(gè)矩陣堆棧
transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);
cameraFrame.MoveForward(-15.0f);
/*
常見函數(shù):
void GLBatch::Begin(GLenum primitive,GLuint nVerts,GLuint nTextureUnits = 0);
參數(shù)1:表示使用的圖元
參數(shù)2:頂點(diǎn)數(shù)
參數(shù)3:紋理坐標(biāo)(可選)
//負(fù)責(zé)頂點(diǎn)坐標(biāo)
void GLBatch::CopyVertexData3f(GLFloat *vNorms);
//結(jié)束,表示已經(jīng)完成數(shù)據(jù)復(fù)制工作
void GLBatch::End(void);
*/
//定義一些點(diǎn)匣砖,三角形形狀科吭。
GLfloat vCoast[9] = {
3,3,0,0,3,0,3,0,0
};
//用點(diǎn)的形式
pointBatch.Begin(GL_POINTS, 3);
pointBatch.CopyVertexData3f(vCoast);
pointBatch.End();
}
案例主要完成以下幾點(diǎn)內(nèi)容:
1、設(shè)置背景顏色
2猴鲫、初始化著色器
3对人、開啟深度測(cè)試開關(guān)
4、設(shè)置變換管線以使用兩個(gè)矩陣堆棧
5拂共、設(shè)置觀察者位置
6牺弄、頂點(diǎn)數(shù)據(jù)創(chuàng)建和傳輸
3、RenderScene函數(shù):主要用于圖形的繪制宜狐,可以系統(tǒng)觸發(fā)势告,也可以開發(fā)者手動(dòng)觸發(fā)蛇捌,工作流程如下:
示例代碼如下:
void RenderScene(void)
{
// Clear the window with current clearing color
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
//壓棧
modelViewMatrix.PushMatrix();
M3DMatrix44f mCamera;
cameraFrame.GetCameraMatrix(mCamera);
//矩陣乘以矩陣堆棧的頂部矩陣,相乘的結(jié)果隨后簡(jiǎn)存儲(chǔ)在堆棧的頂部
modelViewMatrix.MultMatrix(mCamera);
M3DMatrix44f mObjectFrame;
//只要使用 GetMatrix 函數(shù)就可以獲取矩陣堆棧頂部的值咱台,這個(gè)函數(shù)可以進(jìn)行2次重載络拌。用來使用GLShaderManager 的使用』啬纾或者是獲取頂部矩陣的頂點(diǎn)副本數(shù)據(jù)
objectFrame.GetMatrix(mObjectFrame);
//矩陣乘以矩陣堆棧的頂部矩陣春贸,相乘的結(jié)果隨后簡(jiǎn)存儲(chǔ)在堆棧的頂部
modelViewMatrix.MultMatrix(mObjectFrame);
/* GLShaderManager 中的Uniform 值——平面著色器
參數(shù)1:平面著色器
參數(shù)2:運(yùn)行為幾何圖形變換指定一個(gè) 4 * 4變換矩陣
--transformPipeline.GetModelViewProjectionMatrix() 獲取的
GetMatrix函數(shù)就可以獲得矩陣堆棧頂部的值
參數(shù)3:顏色值(黑色)
*/
shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBlack);
//設(shè)置點(diǎn)的大小
glPointSize(4.0f);
pointBatch.Draw();
glPointSize(1.0f);
//還原到以前的模型視圖矩陣(單位矩陣)
modelViewMatrix.PopMatrix();
// 進(jìn)行緩沖區(qū)交換
glutSwapBuffers();
}
矩陣在堆棧中情況如下: