【OpenGL】十二、OpenGL 绘制线段 ( 绘制单条线段 | 绘制多条线段 | 依次连接的点组成的线 | 绘制圈 | 绘制彩色的线 )
文章目錄
- 一、設(shè)置線寬度
- 二、繪制單條線段 GL_LINES
- 三、繪制多條線段 GL_LINES
- 四、繪制依次連接的點組成的線 GL_LINE_STRIP
- 五、繪制圈 GL_LINE_LOOP ( 偶數(shù)個點 )
- 六、繪制圈 GL_LINE_LOOP ( 奇數(shù)個點 )
- 七、繪制彩色的線
- 八、相關(guān)資源
一、設(shè)置線寬度
線的繪制寬度是 OpenGL 狀態(tài)機中的一個值 , 通過 glLineWidth 方法設(shè)置 ; 下面的代碼將線的寬度設(shè)置為 2 像素 ;
// 設(shè)置線的寬度 glLineWidth(2.0f);二、繪制單條線段 GL_LINES
繪制線時, 會將從 glBegin 到 glEnd 之間的所有的點都繪制出來 ;
可以調(diào)用 glVertex3f 方法設(shè)置成對的點 , 每兩個點代表一條線 ;
注意必須成對設(shè)置 , 如果設(shè)置 奇數(shù)個點 , 最后一個點會被丟棄 ;
繪制線段時 , glBegin(GL_LINES) 方法傳入的參數(shù)是 GL_LINES ;
在 glBegin(GL_LINES) 和 glEnd() 之間設(shè)置的點 , 會被自動當做線的兩個端點 ;
如在上述 glBegin 和 glEnd 兩個方法之間調(diào)用了
glVertex3f(0.0f, 0.0f, -10.0f);glVertex3f(-5.0f, 0.0f, -10.0f);代碼 , 含義是繪制一條線段 , 端點分別是 (0,0,-10) 和 (-5,0,-10) ;
代碼示例 :
// 渲染場景// 清除緩沖區(qū) , // 使用之前設(shè)置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除顏色緩沖區(qū)// 紅色背景glClear(GL_COLOR_BUFFER_BIT);// 設(shè)置當前的繪制顏色 , 4 個 unsigned byte // 每個顏色的分量占一個字節(jié)// 參數(shù)數(shù)據(jù)是 R 紅色 G 綠色 B 藍色 A 透明度// 下面設(shè)置的含義是白色, 繪制點的時候, 每次都使用白色繪制glColor4ub(255, 255, 255, 255);// 設(shè)置線的寬度 glLineWidth(2.0f);// 繪制線時, 會將從 glBegin 到 glEnd 之間的所有的點都繪制出來// 可以調(diào)用 glVertex3f 方法 成對 設(shè)置多條線// 注意必須成對設(shè)置 , 如果設(shè)置奇數(shù)個點 , 最后一個點會被丟棄// 繪制線段開始glBegin(GL_LINES);// 繪制線 , 每兩個點組成一條線// glVertex3f (GLfloat x, GLfloat y, GLfloat z)glVertex3f(0.0f, 0.0f, -10.0f);glVertex3f(-5.0f, 0.0f, -10.0f);// 上面的設(shè)置會從 (0,0,-10) 坐標向 (-5,0,-10) 坐標繪制一條線// 繪制點結(jié)束glEnd();// 將后緩沖區(qū)繪制到前臺SwapBuffers(dc);繪制效果 :
注意 : 設(shè)置的點個數(shù)必須是偶數(shù)的 , 如果設(shè)置奇數(shù)個點 , 最后一個點會被舍棄 ;
三、繪制多條線段 GL_LINES
繪制線段時 , glBegin(GL_LINES) 方法傳入的參數(shù)是 GL_LINES ;
在 glBegin(GL_LINES) 和 glEnd() 之間設(shè)置的點 , 會被自動當做線的兩個端點 , 如果設(shè)置 4 個點 , OpenGL 會按照順序 , 從上到下 , 兩兩組合成一條線段 ;
如在上述 glBegin 和 glEnd 兩個方法之間調(diào)用了
glVertex3f(0.0f, 0.0f, -10.0f);glVertex3f(-5.0f, 0.0f, -10.0f);glVertex3f(-5.0f, 0.0f, -10.0f);glVertex3f(-5.0f, -2.0f, -10.0f);代碼 , 含義是 繪制 2 條線段 , 線段 1 端點分別是 (0,0,-10) 和 (-5,0,-10) , 線段 2 端點分別是 (-5,0,-10) 和 (-5, -2, -10) ;
// 渲染場景// 清除緩沖區(qū) , // 使用之前設(shè)置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除顏色緩沖區(qū)// 紅色背景glClear(GL_COLOR_BUFFER_BIT);// 設(shè)置當前的繪制顏色 , 4 個 unsigned byte // 每個顏色的分量占一個字節(jié)// 參數(shù)數(shù)據(jù)是 R 紅色 G 綠色 B 藍色 A 透明度// 下面設(shè)置的含義是白色, 繪制點的時候, 每次都使用白色繪制glColor4ub(255, 255, 255, 255);// 設(shè)置線的寬度 glLineWidth(2.0f);// 繪制線時, 會將從 glBegin 到 glEnd 之間的所有的點都繪制出來// 可以調(diào)用 glVertex3f 方法 成對 設(shè)置多條線// 注意必須成對設(shè)置 , 如果設(shè)置奇數(shù)個點 , 最后一個點會被丟棄// 繪制線段開始glBegin(GL_LINES);// 繪制線 , 每兩個點組成一條線// glVertex3f (GLfloat x, GLfloat y, GLfloat z)glVertex3f(0.0f, 0.0f, -10.0f);glVertex3f(-5.0f, 0.0f, -10.0f);// 上面的設(shè)置會從 (0,0,-10) 坐標向 (-5,0,-10) 坐標繪制一條線glVertex3f(-5.0f, 0.0f, -10.0f);glVertex3f(-5.0f, -2.0f, -10.0f);// 上面的設(shè)置會從 (-5,0,-10) 坐標向 (-5,-2,-10) 坐標繪制一條線// 繪制點結(jié)束glEnd();// 將后緩沖區(qū)繪制到前臺SwapBuffers(dc);繪制效果 :
四、繪制依次連接的點組成的線 GL_LINE_STRIP
給 glBegin 傳入 GL_LINE_STRIP 參數(shù) , 其作用是繪制各個點依次連接的線 , 但是首尾不連接 ;
這里注意與 GL_LINE_LOOP 區(qū)別 , GL_LINE_LOOP 設(shè)置后 , 在 GL_LINE_STRIP 基礎(chǔ)上 , 還要進行首尾連接 ;
代碼示例 :
// 渲染場景// 清除緩沖區(qū) , // 使用之前設(shè)置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除顏色緩沖區(qū)// 紅色背景glClear(GL_COLOR_BUFFER_BIT);// 設(shè)置當前的繪制顏色 , 4 個 unsigned byte // 每個顏色的分量占一個字節(jié)// 參數(shù)數(shù)據(jù)是 R 紅色 G 綠色 B 藍色 A 透明度// 下面設(shè)置的含義是白色, 繪制點的時候, 每次都使用白色繪制glColor4ub(255, 255, 255, 255);// 設(shè)置線的寬度 glLineWidth(2.0f);// 繪制線時, 會將從 glBegin 到 glEnd 之間的所有的點都繪制出來// 可以調(diào)用 glVertex3f 方法 成對 設(shè)置多條線// 注意必須成對設(shè)置 , 如果設(shè)置奇數(shù)個點 , 最后一個點會被丟棄// 繪制線段開始//glBegin(GL_LINES);//glBegin(GL_LINE_LOOP);glBegin(GL_LINE_STRIP);// 繪制線 , 每兩個點組成一條線// glVertex3f (GLfloat x, GLfloat y, GLfloat z)glVertex3f(0.0f, 0.0f, -10.0f);glVertex3f(-5.0f, 0.0f, -10.0f);// 上面的設(shè)置會從 (0,0,-10) 坐標向 (-5,0,-10) 坐標繪制一條線glVertex3f(-5.0f, 0.0f, -10.0f);glVertex3f(-5.0f, -2.0f, -10.0f);// 上面的設(shè)置會從 (-5,0,-10) 坐標向 (-5,-2,-10) 坐標繪制一條線// 繪制點結(jié)束glEnd();// 將后緩沖區(qū)繪制到前臺SwapBuffers(dc);效果展示 :
五、繪制圈 GL_LINE_LOOP ( 偶數(shù)個點 )
繪制圈時 , 在 glBegin 中傳入 GL_LINE_LOOP 參數(shù) , 繪制時會將 glBegin 和 glEnd 之間的點連線 , 并且最后一個點會和第一個點連在一起 , 組成一個圈 ;
代碼示例 : 下面的代碼與 三 中的代碼區(qū)別是 , glBegin 中傳入的參數(shù)是 GL_LINE_LOOP , 不再傳入 GL_LINES 參數(shù) ;
// 渲染場景// 清除緩沖區(qū) , // 使用之前設(shè)置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除顏色緩沖區(qū)// 紅色背景glClear(GL_COLOR_BUFFER_BIT);// 設(shè)置當前的繪制顏色 , 4 個 unsigned byte // 每個顏色的分量占一個字節(jié)// 參數(shù)數(shù)據(jù)是 R 紅色 G 綠色 B 藍色 A 透明度// 下面設(shè)置的含義是白色, 繪制點的時候, 每次都使用白色繪制glColor4ub(255, 255, 255, 255);// 設(shè)置線的寬度 glLineWidth(2.0f);// 繪制線時, 會將從 glBegin 到 glEnd 之間的所有的點都繪制出來// 可以調(diào)用 glVertex3f 方法 成對 設(shè)置多條線// 注意必須成對設(shè)置 , 如果設(shè)置奇數(shù)個點 , 最后一個點會被丟棄// 繪制線段開始//glBegin(GL_LINES);glBegin(GL_LINE_LOOP);// 繪制線 , 每兩個點組成一條線// glVertex3f (GLfloat x, GLfloat y, GLfloat z)glVertex3f(0.0f, 0.0f, -10.0f);glVertex3f(-5.0f, 0.0f, -10.0f);// 上面的設(shè)置會從 (0,0,-10) 坐標向 (-5,0,-10) 坐標繪制一條線glVertex3f(-5.0f, 0.0f, -10.0f);glVertex3f(-5.0f, -2.0f, -10.0f);// 上面的設(shè)置會從 (-5,0,-10) 坐標向 (-5,-2,-10) 坐標繪制一條線// 繪制點結(jié)束glEnd();// 將后緩沖區(qū)繪制到前臺SwapBuffers(dc);繪制效果 : 最后一個點與第一個點連成線段 , 組成一個閉合的三角形 ;
六、繪制圈 GL_LINE_LOOP ( 奇數(shù)個點 )
繪制圈時 , 如果設(shè)置奇數(shù)個點 , 最后一個點也會進行連線 , 如上面的四個點 , 去掉第三個點 , 也可以畫出一模一樣的圖形 ;
// 渲染場景// 清除緩沖區(qū) , // 使用之前設(shè)置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除顏色緩沖區(qū)// 紅色背景glClear(GL_COLOR_BUFFER_BIT);// 設(shè)置當前的繪制顏色 , 4 個 unsigned byte // 每個顏色的分量占一個字節(jié)// 參數(shù)數(shù)據(jù)是 R 紅色 G 綠色 B 藍色 A 透明度// 下面設(shè)置的含義是白色, 繪制點的時候, 每次都使用白色繪制glColor4ub(255, 255, 255, 255);// 設(shè)置線的寬度 glLineWidth(2.0f);// 繪制線時, 會將從 glBegin 到 glEnd 之間的所有的點都繪制出來// 可以調(diào)用 glVertex3f 方法 成對 設(shè)置多條線// 注意必須成對設(shè)置 , 如果設(shè)置奇數(shù)個點 , 最后一個點會被丟棄// 繪制線段開始//glBegin(GL_LINES);glBegin(GL_LINE_LOOP);// 繪制線 , 每兩個點組成一條線// glVertex3f (GLfloat x, GLfloat y, GLfloat z)glVertex3f(0.0f, 0.0f, -10.0f);glVertex3f(-5.0f, 0.0f, -10.0f);// 上面的設(shè)置會從 (0,0,-10) 坐標向 (-5,0,-10) 坐標繪制一條線//glVertex3f(-5.0f, 0.0f, -10.0f);glVertex3f(-5.0f, -2.0f, -10.0f);// 上面的設(shè)置會從 (-5,0,-10) 坐標向 (-5,-2,-10) 坐標繪制一條線// 繪制點結(jié)束glEnd();// 將后緩沖區(qū)繪制到前臺SwapBuffers(dc);七、繪制彩色的線
在上面 六 的代碼基礎(chǔ)上 , 在繪制每個點之前 , 都設(shè)置當前的顏色值 , 即 OpenGL 狀態(tài)機中的當前顏色值 ,
第一個點 glVertex3f(0.0f, 0.0f, -10.0f) , 繪制前設(shè)置的是 白色 ,
第二個點 glVertex3f(-5.0f, 0.0f, -10.0f) , 繪制前設(shè)置的是 綠色 ,
第三個點 glVertex3f(-5.0f, -2.0f, -10.0f) , 繪制前設(shè)置的是 藍色 ;
設(shè)置顏色就是在點設(shè)置前調(diào)用 glColor4ub(0, 0, 255, 255) 方法 , 設(shè)置當前顏色 ;
當 白色的點 到 綠色的點 之間連線時 , 顏色會從白色漸變到綠色 ;
代碼如下 :
// 渲染場景// 清除緩沖區(qū) , // 使用之前設(shè)置的 glClearColor(1.0, 0.0, 0.0, 1.0) 擦除顏色緩沖區(qū)// 紅色背景glClear(GL_COLOR_BUFFER_BIT);// 設(shè)置當前的繪制顏色 , 4 個 unsigned byte // 每個顏色的分量占一個字節(jié)// 參數(shù)數(shù)據(jù)是 R 紅色 G 綠色 B 藍色 A 透明度// 下面設(shè)置的含義是白色, 繪制點的時候, 每次都使用白色繪制glColor4ub(255, 255, 255, 255);// 設(shè)置線的寬度 glLineWidth(2.0f);// 繪制線時, 會將從 glBegin 到 glEnd 之間的所有的點都繪制出來// 可以調(diào)用 glVertex3f 方法 成對 設(shè)置多條線// 注意必須成對設(shè)置 , 如果設(shè)置奇數(shù)個點 , 最后一個點會被丟棄// 繪制線段開始//glBegin(GL_LINES);//glBegin(GL_LINE_STRIP);glBegin(GL_LINE_LOOP);// 繪制線 , 每兩個點組成一條線// glVertex3f (GLfloat x, GLfloat y, GLfloat z)glVertex3f(0.0f, 0.0f, -10.0f);// 設(shè)置綠色 glColor4ub(0, 255, 0, 255);glVertex3f(-5.0f, 0.0f, -10.0f);// 上面的設(shè)置會從 (0,0,-10) 坐標向 (-5,0,-10) 坐標繪制一條線// 設(shè)置藍色glColor4ub(0, 0, 255, 255);//glVertex3f(-5.0f, 0.0f, -10.0f);glVertex3f(-5.0f, -2.0f, -10.0f);glColor4ub(255, 255, 255, 255);// 上面的設(shè)置會從 (-5,0,-10) 坐標向 (-5,-2,-10) 坐標繪制一條線// 繪制點結(jié)束glEnd();// 將后緩沖區(qū)繪制到前臺SwapBuffers(dc);運行效果如下 :
第 111 個點白色 , 第 222 個點綠色 , 第 333 個點藍色 ;
線段 111 白色 ~ 綠色漸變 , 線段 222 綠色 ~ 藍色漸變 , 線段 333 藍色 ~ 白色漸變 , 這是 OpenGL 固定管線差值出來的顏色 ;
八、相關(guān)資源
GitHub 地址 : https://github.com/han1202012/OpenGL
博客源碼快照 : https://download.csdn.net/download/han1202012/14740988
總結(jié)
以上是生活随笔為你收集整理的【OpenGL】十二、OpenGL 绘制线段 ( 绘制单条线段 | 绘制多条线段 | 依次连接的点组成的线 | 绘制圈 | 绘制彩色的线 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【OpenGL】十一、OpenGL 绘制
- 下一篇: 【OpenGL】十三、OpenGL 绘制