OpenGL繪制

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)

設(shè)置模式

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)

OpenGL繪制DEMO

最后編輯于
?著作權(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)容