其實大部分的代碼在之前的案例中都已經(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就是球體的底部
- 一般iStacks是iSlices的兩倍 即
//參數(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è)置
baseRadius和topRadius相等,即效果圖中圓柱效果,即得到規(guī)則的圓柱,-
設(shè)置
baseRadius和topRadius不相等,且不為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_幾何圖形繪制
