項(xiàng)目運(yùn)行流程:
主函數(shù)(main)->手動(dòng)調(diào)用初始化函數(shù)(SetupRC)->執(zhí)行重塑函數(shù)(ChangeSize)->執(zhí)行渲染函數(shù)(RenderScene)
main
- 實(shí)現(xiàn)一些函數(shù)的注冊(cè)和窗口的設(shè)置
- 調(diào)用SetupRC
- 啟動(dòng)mainLoop(運(yùn)行循環(huán))
SetupRC
- 設(shè)置背景顏色
- 初始化固定管線(xiàn)
- 開(kāi)啟深度測(cè)試等
- 利用(modelViewMatrix, projectionMatrix)設(shè)置變換管道,此時(shí)modelViewMatrix是默認(rèn)的單元矩陣,projectionMatrix應(yīng)該是只是傳一個(gè)內(nèi)存地址過(guò)去,使用時(shí)會(huì)從這個(gè)地址取值(待更正)
- 設(shè)置觀察者位置(默認(rèn)在原點(diǎn))
- 設(shè)置各個(gè)需要繪制的批次類(lèi)的頂點(diǎn)數(shù)組,并分別開(kāi)啟提交批次類(lèi)->復(fù)制頂點(diǎn)坐標(biāo)->結(jié)束提交
//參數(shù)1:表示使用的圖元
//參數(shù)2:頂點(diǎn)數(shù)
//參數(shù)3:紋理坐標(biāo)(可選)
void GLBatch::Begin(GLenum primitive,GLuint nVerts,GLuint nTextureUnits = 0);
//復(fù)制頂點(diǎn)坐標(biāo)
void GLBatch::CopyVertexData3f(GLFloat *vNorms);
//結(jié)束,表示已經(jīng)完成數(shù)據(jù)復(fù)制工作
void GLBatch::End(void);
ChangeSize
- 設(shè)置視口
- 設(shè)置Frustum(平截頭體)
//垂直方向上的視場(chǎng)角度
//屏幕寬高比
//近裁剪面距離
//遠(yuǎn)裁剪面距離
void SetPerspective(float fFov, float fAspect, float fNear, float fFar)
- 設(shè)置投影矩陣,通過(guò)Frustum獲取
projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
- 設(shè)置模型視圖矩陣(單元矩陣)
//調(diào)用頂部載入單元矩陣
modelViewMatrix.LoadIdentity();
RenderScene
由于示例使用的是:觀察者不動(dòng),物體動(dòng)的方式
- 清理緩存
- 模型視圖矩陣壓棧(單元矩陣),通過(guò)3,4步的觀察者矩陣(模型矩陣)和視圖變換矩陣(物體矩陣,物體會(huì)翻轉(zhuǎn)或移動(dòng))
- 通過(guò)觀察者坐標(biāo)獲取觀察者矩陣,跟棧頂?shù)膯卧仃囅喑说玫叫碌木仃?,存放在棧?/li>
- 通過(guò)物體坐標(biāo)獲取物體位置矩陣(視圖變換矩陣),跟存放在棧頂?shù)男戮仃囅喑?,存放在棧?/li>
- 使用平面著色器繪制
//GLShaderManager 中的Uniform 值——平面著色器
//參數(shù)1:平面著色器
//參數(shù)2:幾何圖形變換獲得的一個(gè) 4 * 4變換矩陣,transformPipeline.GetModelViewProjectionMatrix() 獲取,GetMatrix函數(shù)就可以獲得矩陣堆棧頂部的值
//參數(shù)3:顏色值(黑色)
shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBlack);
- 出棧
- 交換緩存區(qū)