日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【OpenGL】十三、OpenGL 绘制三角形 ( 绘制单个三角形 | 三角形绘制顺序 | 绘制多个三角形 )

發(fā)布時間:2025/6/17 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【OpenGL】十三、OpenGL 绘制三角形 ( 绘制单个三角形 | 三角形绘制顺序 | 绘制多个三角形 ) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 一、繪制三角形
  • 二、三角形繪制順序
    • 1、繪制正面
    • 2、三個點逆時針方向排列
    • 3、三個點順時針方向排列
    • 4、設置點的正面方向
  • 三、繪制多個三角形
  • 四、相關資源





一、繪制三角形



三角形繪制即繪制一個面 , 三個點可以唯一確定一個面 , 四個點及多個點組成的多邊形 , 不一定是一個面 ;


繪制三角形面時 , 在 glBegin 方法中傳入 GL_TRIANGLES 參數(shù) , 然后在 glBeginglEnd 之間設置多個點 , OpenGL 會自動將三個點組成一個三角形面 , 繪制出來 ;


其中每個點都可以設置一個顏色值 , 面上的顏色都是通過三個點的顏色差值出來的 ;


代碼示例 :

// 渲染場景// 清除緩沖區(qū) , // 使用之前設置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除顏色緩沖區(qū)// 紅色背景glClear(GL_COLOR_BUFFER_BIT);// 設置當前的繪制顏色 , 4 個 unsigned byte // 每個顏色的分量占一個字節(jié)// 參數(shù)數(shù)據(jù)是 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();// 將后緩沖區(qū)繪制到前臺SwapBuffers(dc);

繪制效果 :





二、三角形繪制順序





1、繪制正面


討論下面的繪制順序時 , 加入一個前提 , OpenGL 只繪制模型正面, 不繪制模型背面 ;

正面就是 攝像機對著的那一面 ;

在渲染前 , 調(diào)用 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、設置點的正面方向


上面將三個點按照順時針排列 , 繪制不出來 , 調(diào)用 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);// 主消息循環(huán):while (GetMessage(&msg, nullptr, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}// 渲染場景// 清除緩沖區(qū) , // 使用之前設置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除顏色緩沖區(qū)// 紅色背景glClear(GL_COLOR_BUFFER_BIT);// 設置當前的繪制顏色 , 4 個 unsigned byte // 每個顏色的分量占一個字節(jié)// 參數(shù)數(shù)據(jù)是 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();// 將后緩沖區(qū)繪制到前臺SwapBuffers(dc);}

執(zhí)行結果 :


分析下點的順序 :

// 第 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 之間設置多個三角形點即可 , 系統(tǒng)會按照從上到下 , 每 333 個點組成一個三角形 ;

代碼示例 : 注意下面的三角形的點是按照順時針順序排列的 ;

// 只顯示正面 , 不顯示背面glEnable(GL_CULL_FACE);// 設置順時針方向 CW : Clock Wind 順時針方向// 默認是 GL_CCW : Counter Clock Wind 逆時針方向 glFrontFace(GL_CW);// 主消息循環(huán):while (GetMessage(&msg, nullptr, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}// 渲染場景// 清除緩沖區(qū) , // 使用之前設置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除顏色緩沖區(qū)// 紅色背景glClear(GL_COLOR_BUFFER_BIT);// 設置當前的繪制顏色 , 4 個 unsigned byte // 每個顏色的分量占一個字節(jié)// 參數(shù)數(shù)據(jù)是 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();// 將后緩沖區(qū)繪制到前臺SwapBuffers(dc);}

運行效果 :





四、相關資源



GitHub 地址 : https://github.com/han1202012/OpenGL
( GitHub 源碼始終都會隨著后續(xù)博客的進度更新覆蓋 , 可能沒有本博客的相關源碼 , 推薦下載博客源碼快照 ) ;

博客源碼快照 : https://download.csdn.net/download/han1202012/14753854

總結

以上是生活随笔為你收集整理的【OpenGL】十三、OpenGL 绘制三角形 ( 绘制单个三角形 | 三角形绘制顺序 | 绘制多个三角形 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。