前言

Untitled.gif
最終實(shí)現(xiàn)的效果如上圖所示,例子OpenGL圖元繪制是這個(gè)例子
如圖所示,整體的繪制流程如下

- main函數(shù):程序入口
- ChangeSize函數(shù):主要是設(shè)置視口及投影方式
- SetupRC函數(shù):圖形數(shù)據(jù)配置,主要是頂點(diǎn)數(shù)據(jù)及圖元連接方式
- RenderScene函數(shù):主要用于圖形的繪制,可以系統(tǒng)觸發(fā),也可以開發(fā)者手動觸發(fā)
- SpecialKeys函數(shù):對特殊鍵位的回調(diào)處理
- KeyPressFunc:針對空格鍵的回調(diào)處理
- DrawWireFrameBatch:用于立體圖形的填充及邊框繪制
ChangeSize函數(shù)
在之前的demo中,changeSize主要是用來設(shè)置視口大小以及當(dāng)視口發(fā)生變化時(shí)調(diào)用的,而本案例中立體圖形的繪制需要使用投影矩陣,因此需要在該函數(shù)中設(shè)置投影矩陣
主要涉及以下幾個(gè)步驟
- 設(shè)置圖形投影的方式:因?yàn)槭橇Ⅲw圖形,所以選擇透視投影
//參數(shù)1:垂直方向上的視場角度
//參數(shù)2:視口縱橫比 = w/h
//參數(shù)3:近裁剪面距離
//參數(shù)4:遠(yuǎn)裁剪面距離
viewFrustum.SetPerspective(35.0f, float(w)/float(h), 1.0f, 500.0f);
- 通過設(shè)置的投影方式獲得投影矩陣,并將其存入投影矩陣中
projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
- 初始化模型視圖矩陣堆棧,壓入一個(gè)單元矩陣
modelViewMatrix.LoadIdentity();
SetupRC函數(shù)
從流程圖上可以看出,除了基本的背景色設(shè)置,存儲著色器初始化以及頂點(diǎn)數(shù)據(jù)的創(chuàng)建及傳輸外,還需要對陣矩陣及觀察者做一下設(shè)置
- 將模型視圖矩陣和投影矩陣放到變換管道中,變換管道的作用是能幫助快速進(jìn)行矩陣相乘,在RenderScene函數(shù)中可以直接通過變換管道的Get方法得到相應(yīng)的矩陣
transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);
其中,變換管道通過get可獲得的矩陣有4種
| 方法 | 說明 |
|---|---|
| void MoveForward(float fDelta) | 向外移動的像素點(diǎn),修改z |
| void MoveUp(float fDelta) | 向上移動的像素點(diǎn),修改y |
| void MoveRight(float fDelta) | 向右移動的像素點(diǎn),修改x |
[圖片上傳中...(2251862-2ac84f6bd9deb88d.png-4f3fb-1594608365903-0)]
RenderScene函數(shù)
其流程如下所示,主要是立體圖形的渲染過程

2251862-2ac84f6bd9deb88d.png
從流程圖中可以看出,這個(gè)過程是將物體坐標(biāo)轉(zhuǎn)換為裁剪坐標(biāo),然后經(jīng)過OpenGL的處理,轉(zhuǎn)換為NDC,并顯示到屏幕上的一個(gè)過程。在此過程中棧的變化如下所示

- ChangeSize函數(shù)中向棧中初始化了一個(gè)單元矩陣
- RenderScene函數(shù)中再次向棧中壓入一個(gè)單元矩陣:主要是為了圖形繪制完成后,矩陣的復(fù)原,所以此時(shí)棧中有兩個(gè)單元矩陣
modelViewMatrix.PushMatrix();
- 將cameraFrame構(gòu)建為 觀察者矩陣,將棧頂單元矩陣取出,與觀察者矩陣相乘,得到新的觀察者矩陣,再將其入棧
M3DMatrix44f mCamera;
cameraFrame.GetCameraMatrix(mCamera);
modelViewMatrix.MultMatrix(mCamera);
- 將objectFrame構(gòu)建為 物體矩陣,取出棧頂?shù)挠^察者矩陣,與物體矩陣相乘,得到模型視圖矩陣,并將其入棧
然后利用固定管線渲染圖形,在圖像渲染完成后,將棧中模型視圖矩陣pop,恢復(fù)其初始狀態(tài)。