【OpenGL】十三、OpenGL 绘制三角形 ( 绘制单个三角形 | 三角形绘制顺序 | 绘制多个三角形 )
文章目錄
- 一、繪制三角形
- 二、三角形繪制順序
- 1、繪制正面
- 2、三個點逆時針方向排列
- 3、三個點順時針方向排列
- 4、設置點的正面方向
- 三、繪制多個三角形
- 四、相關資源
一、繪制三角形
三角形繪制即繪制一個面 , 三個點可以唯一確定一個面 , 四個點及多個點組成的多邊形 , 不一定是一個面 ;
繪制三角形面時 , 在 glBegin 方法中傳入 GL_TRIANGLES 參數 , 然后在 glBegin 和 glEnd 之間設置多個點 , OpenGL 會自動將三個點組成一個三角形面 , 繪制出來 ;
其中每個點都可以設置一個顏色值 , 面上的顏色都是通過三個點的顏色差值出來的 ;
代碼示例 :
// 渲染場景// 清除緩沖區 , // 使用之前設置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除顏色緩沖區// 紅色背景glClear(GL_COLOR_BUFFER_BIT);// 設置當前的繪制顏色 , 4 個 unsigned byte // 每個顏色的分量占一個字節// 參數數據是 R 紅色 G 綠色 B 藍色 A 透明度// 下面設置的含義是白色, 繪制點的時候, 每次都使用白色繪制glColor4ub(255, 255, 255, 255);// 設置線的寬度 glLineWidth(2.0f);//glBegin(GL_POINTS); // 繪制點//glBegin(GL_LINES); // 繪制線//glBegin(GL_LINE_STRIP);// 繪制前后連接的點組成的線//glBegin(GL_LINE_LOOP); // 繪制前后連接的點組成的線 , 并且收尾相連// 繪制三角形面 ★★glBegin(GL_TRIANGLES);// 設置白色 , glVertex3f (GLfloat x, GLfloat y, GLfloat z)glColor4ub(255, 255, 255, 255);glVertex3f(0.0f, 0.0f, -10.0f);// 設置綠色 glColor4ub(0, 255, 0, 255);glVertex3f(-5.0f, 0.0f, -10.0f);// 設置藍色glColor4ub(0, 0, 255, 255);glVertex3f(-5.0f, -2.0f, -10.0f);// 繪制三角形結束 ★★glEnd();// 將后緩沖區繪制到前臺SwapBuffers(dc);繪制效果 :
二、三角形繪制順序
1、繪制正面
討論下面的繪制順序時 , 加入一個前提 , OpenGL 只繪制模型正面, 不繪制模型背面 ;
正面就是 攝像機對著的那一面 ;
在渲染前 , 調用 glEnable(GL_CULL_FACE) 設置 , 即可設置 OpenGL 只繪制正面 , 不繪制背面 ;
// 只顯示正面 , 不顯示背面glEnable(GL_CULL_FACE);默認情況下 OpenGL 會繪制正面 , 背面兩面 ;
2、三個點逆時針方向排列
點的正面方向是逆時針方向的 , 因此繪制的時候 , 默認是逆時針繪制 , 即第一個點連接第二個點 , 第二個點連接第三個點 , 第三個點連接第一個點 , 這樣繪制 ;
設置三個點的代碼 :
// 第 1 個點 : 設置白色 , glVertex3f (GLfloat x, GLfloat y, GLfloat z)glColor4ub(255, 255, 255, 255);glVertex3f(0.0f, 0.0f, -10.0f);// 第 2 個點 : 設置綠色 ★glColor4ub(0, 255, 0, 255);glVertex3f(-5.0f, 0.0f, -10.0f);// 第 3 個點 : 設置藍色 ★glColor4ub(0, 0, 255, 255);glVertex3f(-5.0f, -2.0f, -10.0f);上述設置的三個點是按照逆時針方向排列 , 此時才能將面繪制出來 ;
3、三個點順時針方向排列
如果將第三個點放到中間 , 此時點的排列是順時針方向 , 繪制三角形時就會繪制失敗 , 繪制出來就是一片空白 ;
設置三個點的代碼 :
// 第 1 個點 : 設置白色 , glVertex3f (GLfloat x, GLfloat y, GLfloat z)glColor4ub(255, 255, 255, 255);glVertex3f(0.0f, 0.0f, -10.0f);// 第 2 個點 : 設置藍色glColor4ub(0, 0, 255, 255);glVertex3f(-5.0f, -2.0f, -10.0f);// 第 3 個點 : 設置綠色 glColor4ub(0, 255, 0, 255);glVertex3f(-5.0f, 0.0f, -10.0f);點的位置效果 ( 非 OpenGL 繪制效果 , OpenGL 繪制出來是空白的 ) :
OpenGL 繪制效果 : 按照上述順時針排列點 , 繪制不出三角形 ;
4、設置點的正面方向
上面將三個點按照順時針排列 , 繪制不出來 , 調用 glFrontFace(GL_CW) 方法 , 可以修改點的排列方向為順時針方向 ;
// 設置順時針方向 CW : Clock Wind 順時針方向// 默認是 GL_CCW : Counter Clock Wind 逆時針方向 glFrontFace(GL_CW);完整代碼示例 :
// 只顯示正面 , 不顯示背面glEnable(GL_CULL_FACE); ★// 設置順時針方向 CW : Clock Wind 順時針方向// 默認是 GL_CCW : Counter Clock Wind 逆時針方向 glFrontFace(GL_CW); ★// 主消息循環:while (GetMessage(&msg, nullptr, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}// 渲染場景// 清除緩沖區 , // 使用之前設置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除顏色緩沖區// 紅色背景glClear(GL_COLOR_BUFFER_BIT);// 設置當前的繪制顏色 , 4 個 unsigned byte // 每個顏色的分量占一個字節// 參數數據是 R 紅色 G 綠色 B 藍色 A 透明度// 下面設置的含義是白色, 繪制點的時候, 每次都使用白色繪制glColor4ub(255, 255, 255, 255);// 設置線的寬度 glLineWidth(2.0f);//glBegin(GL_POINTS); // 繪制點//glBegin(GL_LINES); // 繪制線//glBegin(GL_LINE_STRIP);// 繪制前后連接的點組成的線//glBegin(GL_LINE_LOOP); // 繪制前后連接的點組成的線 , 并且收尾相連// 繪制三角形面 ★glBegin(GL_TRIANGLES); // 設置白色 , glVertex3f (GLfloat x, GLfloat y, GLfloat z)glColor4ub(255, 255, 255, 255);glVertex3f(0.0f, 0.0f, -10.0f);// 設置藍色glColor4ub(0, 0, 255, 255);glVertex3f(-5.0f, -2.0f, -10.0f);// 設置綠色 glColor4ub(0, 255, 0, 255);glVertex3f(-5.0f, 0.0f, -10.0f);// 繪制三角形結束 ★glEnd();// 將后緩沖區繪制到前臺SwapBuffers(dc);}執行結果 :
分析下點的順序 :
// 第 1 個點 : 設置白色 , glVertex3f (GLfloat x, GLfloat y, GLfloat z)glColor4ub(255, 255, 255, 255);glVertex3f(0.0f, 0.0f, -10.0f);// 第 2 個點 : 設置藍色glColor4ub(0, 0, 255, 255);glVertex3f(-5.0f, -2.0f, -10.0f);// 第 3 個點 : 設置綠色 glColor4ub(0, 255, 0, 255);glVertex3f(-5.0f, 0.0f, -10.0f);上述三個點是按照順時針順序排列的 ;
三、繪制多個三角形
繪制多個三角形時 , 在 glBegin 和 glEnd 之間設置多個三角形點即可 , 系統會按照從上到下 , 每 333 個點組成一個三角形 ;
代碼示例 : 注意下面的三角形的點是按照順時針順序排列的 ;
// 只顯示正面 , 不顯示背面glEnable(GL_CULL_FACE);// 設置順時針方向 CW : Clock Wind 順時針方向// 默認是 GL_CCW : Counter Clock Wind 逆時針方向 glFrontFace(GL_CW);// 主消息循環:while (GetMessage(&msg, nullptr, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}// 渲染場景// 清除緩沖區 , // 使用之前設置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除顏色緩沖區// 紅色背景glClear(GL_COLOR_BUFFER_BIT);// 設置當前的繪制顏色 , 4 個 unsigned byte // 每個顏色的分量占一個字節// 參數數據是 R 紅色 G 綠色 B 藍色 A 透明度// 下面設置的含義是白色, 繪制點的時候, 每次都使用白色繪制glColor4ub(255, 255, 255, 255);// 設置線的寬度 glLineWidth(2.0f);//glBegin(GL_POINTS); // 繪制點//glBegin(GL_LINES); // 繪制線//glBegin(GL_LINE_STRIP);// 繪制前后連接的點組成的線//glBegin(GL_LINE_LOOP); // 繪制前后連接的點組成的線 , 并且收尾相連// 繪制三角形面glBegin(GL_TRIANGLES);// 第一個三角形 ( 注意點是順時針排列的 )// 設置白色 , glVertex3f (GLfloat x, GLfloat y, GLfloat z)glColor4ub(255, 255, 255, 255);glVertex3f(0.0f, 0.0f, -10.0f);// 設置藍色glColor4ub(0, 0, 255, 255);glVertex3f(-5.0f, -2.0f, -10.0f);// 設置綠色 glColor4ub(0, 255, 0, 255);glVertex3f(-5.0f, 0.0f, -10.0f);// 第二個三角形 ( 注意點是順時針排列的 )// 設置白色 , glVertex3f (GLfloat x, GLfloat y, GLfloat z)glColor4ub(255, 255, 255, 255);glVertex3f(0.0f, 0.0f, -10.0f);// 設置綠色 glColor4ub(0, 255, 0, 255);glVertex3f(5.0f, 0.0f, -10.0f);// 設置藍色glColor4ub(0, 0, 255, 255);glVertex3f(5.0f, -2.0f, -10.0f);// 繪制三角形結束glEnd();// 將后緩沖區繪制到前臺SwapBuffers(dc);}運行效果 :
四、相關資源
GitHub 地址 : https://github.com/han1202012/OpenGL
( GitHub 源碼始終都會隨著后續博客的進度更新覆蓋 , 可能沒有本博客的相關源碼 , 推薦下載博客源碼快照 ) ;
博客源碼快照 : https://download.csdn.net/download/han1202012/14753854
總結
以上是生活随笔為你收集整理的【OpenGL】十三、OpenGL 绘制三角形 ( 绘制单个三角形 | 三角形绘制顺序 | 绘制多个三角形 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【OpenGL】十二、OpenGL 绘制
- 下一篇: 【OpenGL】十四、OpenGL 绘制