OpenGL繪制流程

上圖右側(cè)為初始化準(zhǔn)備階段,左側(cè)為mainLoop監(jiān)控到相關(guān)事件后,進(jìn)行的回調(diào);
main:程序入口
SetupRC:自定義函數(shù)(調(diào)用一次,來(lái)做OpenGL初始化) 設(shè)置需要渲染圖形的相關(guān)頂點(diǎn)數(shù)據(jù)/顏色數(shù)據(jù)等數(shù)據(jù)裝備工作,圖元連接方式
ChangeSize:通過(guò)glutReShaperFunc 注冊(cè)為重塑函數(shù), 當(dāng)屏幕大小發(fā)生變化/或者第一次創(chuàng)建窗口時(shí),會(huì)調(diào)用該函數(shù)調(diào)整窗口大小/視口大小
RenderScene:通過(guò)glutDisplayFunc 注冊(cè)為顯示渲染函數(shù),當(dāng)屏幕發(fā)生變化/或者開(kāi)發(fā)者主動(dòng)渲染會(huì)調(diào)用此函數(shù),用來(lái)實(shí)現(xiàn)數(shù)據(jù)->渲染過(guò)程 (可自動(dòng)也可手動(dòng)觸發(fā))
SpecialKeys:通過(guò)glutSpecialFunc 注冊(cè)為特殊鍵盤(pán)處理函數(shù)
KeyPressFunc:通過(guò)glutKeyboardFunc 針對(duì)空格鍵的處理函數(shù)
DrawWireFrameBatch:用于立體圖形的填充及邊框繪制
相關(guān)函數(shù)詳解
ChangeSize函數(shù)
觸發(fā)條件:新建窗口、窗口尺寸發(fā)生調(diào)整
處理業(yè)務(wù):設(shè)置OpenGL視口,設(shè)置OpenGL投影方式等
a.設(shè)置投影方式(3D圖形,需要使用投影模型)
//參數(shù)1:垂直方向上的視場(chǎng)角度
//參數(shù)2:視口縱橫比 = w/h
//參數(shù)3:近裁剪面距離
//參數(shù)4:遠(yuǎn)裁剪面距離
viewFrustum.SetPerspective(35.0f,float(w)/float(h),1.0f,500.0f);
b.加載投影矩陣?
projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
c.加載單元矩陣
modelViewMatrix.LoadIdentity();
投影矩陣、單元矩陣在設(shè)置變換管線時(shí)以使用兩個(gè)矩陣堆棧
SetupRC函數(shù)
在SetUpRC中進(jìn)行了基本的設(shè)置外,接下來(lái)還需要進(jìn)入如下設(shè)置
a.需要將模型視圖矩陣和投影矩陣放到變換管道中,變換管道的作用是能幫助快速進(jìn)行矩陣相乘,在RenderScene函數(shù)中可以直接通過(guò)變換管道的Get方法得到相應(yīng)的矩陣
transformPipeline.SetMatrixStacks(modelViewMatrix,projectionMatrix);

b.設(shè)置觀察者位置,或者物體位置(選擇其中一種即可)
cameraFrame.MoveForward(-15.0f);//觀察者不動(dòng)、移動(dòng)物體
objectFrame.MoveForward(15.0f);//物體不同,觀察者動(dòng)

RenderScene函數(shù)

關(guān)于壓棧以及棧的作用
棧的作用:(棧做什么用?記錄一下?tīng)顟B(tài)(保持臨時(shí)結(jié)果),進(jìn)行撤回操作)
在ChangeSize函數(shù)中向棧中初始化了一個(gè)單元矩陣,RenderScene函數(shù)中再次向棧中壓入一個(gè)單元矩陣:主要是為了圖形繪制完成后,矩陣的復(fù)原,所以此時(shí)棧中有兩個(gè)單元矩陣;
將cameraFrame構(gòu)建為 觀察者矩陣,將棧頂單元矩陣取出,與觀察者矩陣相乘,得到新的觀察者矩陣,再將其入棧
將objectFrame構(gòu)建為 物體矩陣,取出棧頂?shù)挠^察者矩陣,與物體矩陣相乘,得到模型視圖矩陣,并將其入棧
然后利用固定管線渲染圖形,在圖像渲染完成后,將棧中模型視圖矩陣pop,恢復(fù)其初始狀態(tài)