OpenGL 案例金字塔、六邊形、圓環(huán)的繪制

前言

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è)過程。在此過程中棧的變化如下所示

![2251862-f6d135374581a79b.png](https://upload-images.jianshu.io/upload_images/3410830-a235552dc5eed3dc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  • 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)。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容