案例04:幾何圖形繪制

OpenGL + OpenGL ES +Metal 系列文章匯總

其實大部分的代碼在之前的案例中都已經(jīng)寫過了,這個案例的主要目的是了解OpenGL中系統(tǒng)定義好的模型有哪些。

最終的實現(xiàn)效果如下:


案例-幾何圖形繪制效果圖_1.gif

整體的流程圖如下所示

整體流程

根據(jù)上面的流程圖,大致說下函數(shù)的功能

  • main函數(shù):
    • 初始化GL相關(guān)庫
    • 注冊自定義函數(shù)
    • 初始化數(shù)據(jù)
  • ChangeSize函數(shù):
    • 設(shè)置視口
    • 設(shè)置投影方式得到投影矩陣,并載入投影矩陣堆棧
    • 設(shè)置變換管道,管理矩陣堆棧
  • setupRC函數(shù)
    • 初始化:背景色,固定著色器
    • 開啟深度測試
    • 設(shè)置觀察方式
    • 利用三角形批次類創(chuàng)建球、環(huán)、圓柱、錐、磁盤
  • RenderScene函數(shù)
    • 清除緩沖區(qū)
    • 矩陣堆棧push
    • 繪制圖形 - DrawWireFrameBatch函數(shù)
    • 矩陣堆棧pop
    • 交換緩沖區(qū)
  • DrawWireFrameBatch函數(shù)
    • 利用固定著色器和三角形批次類繪制圖形
    • 繪制圖形邊框:可以參考這篇案例03 補充:金字塔等圖形邊框的繪制,需要開啟多邊形偏移,混合功能等
    • 繪制完成,恢復設(shè)置:關(guān)閉多邊形偏移、混合功能等
  • SpecialKeys函數(shù):主要是根據(jù)特殊鍵位的切換,旋轉(zhuǎn)物體
  • KeyPressFunc函數(shù):通過空格鍵切換不同圖形的渲染

OpenGL中自帶的模型

  • 球 - gltMakeSphere
    • 一般iStacks是iSlices的兩倍 即iSlices * 2 = iStacks
    • 繪制球體都是圍繞z軸,+z就是球體的頂點,-z就是球體的底部
//參數(shù)1:sphereBatch,三角形批次類對象
//參數(shù)2:fRadius,球體半徑
//參數(shù)3:iSlices,從球體底部堆疊到頂部的三角形帶的數(shù)量;其實球體是一圈一圈三角形帶組成
//參數(shù)4:iStacks,圍繞球體一圈排列的三角形對數(shù)

gltMakeSphere(GLTriangleBatch& sphereBatch, GLfloat fRadius, GLint iSlices, GLint iStacks);
  • 環(huán) - gltMakeTorus
//參數(shù)1:torusBatch,三角形批次類對象
//參數(shù)2:majorRadius,甜甜圈中心到外邊緣的半徑
//參數(shù)3:minorRadius,甜甜圈中心到內(nèi)邊緣的半徑
//參數(shù)4:numMajor,沿著主半徑的三角形數(shù)量
//參數(shù)5:numMinor,沿著內(nèi)部較小半徑的三角形數(shù)量

gltMakeTorus(GLTriangleBatch& torusBatch, GLfloat majorRadius, GLfloat minorRadius, GLint numMajor, GLint numMinor);
  • 圓柱/圓錐 - gltMakeCylinder
    • 設(shè)置baseRadiustopRadius 相等,即效果圖中圓柱效果,即得到規(guī)則的圓柱,

    • 設(shè)置baseRadiustopRadius不相等,且不為0,得到的有點類似于一個喇叭

      喇叭

    • 僅設(shè)置其中一個,另一個為0,即可得到一個圓錐,即效果圖中的圓錐效果

//參數(shù)1:cylinderBatch,三角形批次類對象
//參數(shù)2:baseRadius,底部半徑
//參數(shù)3:topRadius,頭部半徑
//參數(shù)4:fLength,圓形長度
//參數(shù)5:numSlices,圍繞Z軸的三角形對的數(shù)量
//參數(shù)6:numStacks,圓柱底部堆疊到頂部圓環(huán)的三角形數(shù)量

void gltMakeCylinder(GLTriangleBatch& cylinderBatch, GLfloat baseRadius, GLfloat topRadius, GLfloat fLength, GLint numSlices, GLint numStacks);
  • 磁盤 - gltMakeDisk
//參數(shù)1:diskBatch,三角形批次類對象
//參數(shù)2:innerRadius,內(nèi)圓半徑
//參數(shù)3:outerRadius,外圓半徑
//參數(shù)4:nSlices,圓盤圍繞Z軸的三角形對的數(shù)量
//參數(shù)5:nStacks,圓盤外網(wǎng)到內(nèi)圍的三角形數(shù)量

void gltMakeDisk(GLTriangleBatch& diskBatch, GLfloat innerRadius, GLfloat outerRadius, GLint nSlices, GLint nStacks);

完整的Demo實現(xiàn)見github - 05_OpenGL_02_幾何圖形繪制

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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