欢迎访问 生活随笔!

生活随笔

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

编程问答

【OpenGL】十二、OpenGL 绘制线段 ( 绘制单条线段 | 绘制多条线段 | 依次连接的点组成的线 | 绘制圈 | 绘制彩色的线 )

发布时间:2025/6/17 编程问答 42 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【OpenGL】十二、OpenGL 绘制线段 ( 绘制单条线段 | 绘制多条线段 | 依次连接的点组成的线 | 绘制圈 | 绘制彩色的线 ) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

  • 一、设置线宽度
  • 二、绘制单条线段 GL_LINES
  • 三、绘制多条线段 GL_LINES
  • 四、绘制依次连接的点组成的线 GL_LINE_STRIP
  • 五、绘制圈 GL_LINE_LOOP ( 偶数个点 )
  • 六、绘制圈 GL_LINE_LOOP ( 奇数个点 )
  • 七、绘制彩色的线
  • 八、相关资源





一、设置线宽度



线的绘制宽度是 OpenGL 状态机中的一个值 , 通过 glLineWidth 方法设置 ; 下面的代码将线的宽度设置为 2 像素 ;

// 设置线的宽度 glLineWidth(2.0f);



二、绘制单条线段 GL_LINES



绘制线时, 会将从 glBeginglEnd 之间的所有的点都绘制出来 ;

可以调用 glVertex3f 方法设置成对的点 , 每两个点代表一条线 ;

注意必须成对设置 , 如果设置 奇数个点 , 最后一个点会被丢弃 ;


绘制线段时 , glBegin(GL_LINES) 方法传入的参数是 GL_LINES ;

在 glBegin(GL_LINES) 和 glEnd() 之间设置的点 , 会被自动当做线的两个端点 ;

如在上述 glBegin 和 glEnd 两个方法之间调用了

glVertex3f(0.0f, 0.0f, -10.0f);glVertex3f(-5.0f, 0.0f, -10.0f);

代码 , 含义是绘制一条线段 , 端点分别是 (0,0,-10) 和 (-5,0,-10) ;


代码示例 :

// 渲染场景// 清除缓冲区 , // 使用之前设置的 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 到 glEnd 之间的所有的点都绘制出来// 可以调用 glVertex3f 方法 成对 设置多条线// 注意必须成对设置 , 如果设置奇数个点 , 最后一个点会被丢弃// 绘制线段开始glBegin(GL_LINES);// 绘制线 , 每两个点组成一条线// glVertex3f (GLfloat x, GLfloat y, GLfloat z)glVertex3f(0.0f, 0.0f, -10.0f);glVertex3f(-5.0f, 0.0f, -10.0f);// 上面的设置会从 (0,0,-10) 坐标向 (-5,0,-10) 坐标绘制一条线// 绘制点结束glEnd();// 将后缓冲区绘制到前台SwapBuffers(dc);

绘制效果 :


注意 : 设置的点个数必须是偶数的 , 如果设置奇数个点 , 最后一个点会被舍弃 ;





三、绘制多条线段 GL_LINES



绘制线段时 , glBegin(GL_LINES) 方法传入的参数是 GL_LINES ;

在 glBegin(GL_LINES) 和 glEnd() 之间设置的点 , 会被自动当做线的两个端点 , 如果设置 4 个点 , OpenGL 会按照顺序 , 从上到下 , 两两组合成一条线段 ;

如在上述 glBegin 和 glEnd 两个方法之间调用了

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) ;

// 渲染场景// 清除缓冲区 , // 使用之前设置的 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 到 glEnd 之间的所有的点都绘制出来// 可以调用 glVertex3f 方法 成对 设置多条线// 注意必须成对设置 , 如果设置奇数个点 , 最后一个点会被丢弃// 绘制线段开始glBegin(GL_LINES);// 绘制线 , 每两个点组成一条线// glVertex3f (GLfloat x, GLfloat y, GLfloat z)glVertex3f(0.0f, 0.0f, -10.0f);glVertex3f(-5.0f, 0.0f, -10.0f);// 上面的设置会从 (0,0,-10) 坐标向 (-5,0,-10) 坐标绘制一条线glVertex3f(-5.0f, 0.0f, -10.0f);glVertex3f(-5.0f, -2.0f, -10.0f);// 上面的设置会从 (-5,0,-10) 坐标向 (-5,-2,-10) 坐标绘制一条线// 绘制点结束glEnd();// 将后缓冲区绘制到前台SwapBuffers(dc);

绘制效果 :





四、绘制依次连接的点组成的线 GL_LINE_STRIP



给 glBegin 传入 GL_LINE_STRIP 参数 , 其作用是绘制各个点依次连接的线 , 但是首尾不连接 ;

这里注意与 GL_LINE_LOOP 区别 , GL_LINE_LOOP 设置后 , 在 GL_LINE_STRIP 基础上 , 还要进行首尾连接 ;

代码示例 :

// 渲染场景// 清除缓冲区 , // 使用之前设置的 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 到 glEnd 之间的所有的点都绘制出来// 可以调用 glVertex3f 方法 成对 设置多条线// 注意必须成对设置 , 如果设置奇数个点 , 最后一个点会被丢弃// 绘制线段开始//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);// 上面的设置会从 (0,0,-10) 坐标向 (-5,0,-10) 坐标绘制一条线glVertex3f(-5.0f, 0.0f, -10.0f);glVertex3f(-5.0f, -2.0f, -10.0f);// 上面的设置会从 (-5,0,-10) 坐标向 (-5,-2,-10) 坐标绘制一条线// 绘制点结束glEnd();// 将后缓冲区绘制到前台SwapBuffers(dc);

效果展示 :





五、绘制圈 GL_LINE_LOOP ( 偶数个点 )



绘制圈时 , 在 glBegin 中传入 GL_LINE_LOOP 参数 , 绘制时会将 glBegin 和 glEnd 之间的点连线 , 并且最后一个点会和第一个点连在一起 , 组成一个圈 ;

代码示例 : 下面的代码与 三 中的代码区别是 , glBegin 中传入的参数是 GL_LINE_LOOP , 不再传入 GL_LINES 参数 ;

// 渲染场景// 清除缓冲区 , // 使用之前设置的 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 到 glEnd 之间的所有的点都绘制出来// 可以调用 glVertex3f 方法 成对 设置多条线// 注意必须成对设置 , 如果设置奇数个点 , 最后一个点会被丢弃// 绘制线段开始//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);// 上面的设置会从 (0,0,-10) 坐标向 (-5,0,-10) 坐标绘制一条线glVertex3f(-5.0f, 0.0f, -10.0f);glVertex3f(-5.0f, -2.0f, -10.0f);// 上面的设置会从 (-5,0,-10) 坐标向 (-5,-2,-10) 坐标绘制一条线// 绘制点结束glEnd();// 将后缓冲区绘制到前台SwapBuffers(dc);

绘制效果 : 最后一个点与第一个点连成线段 , 组成一个闭合的三角形 ;





六、绘制圈 GL_LINE_LOOP ( 奇数个点 )



绘制圈时 , 如果设置奇数个点 , 最后一个点也会进行连线 , 如上面的四个点 , 去掉第三个点 , 也可以画出一模一样的图形 ;

// 渲染场景// 清除缓冲区 , // 使用之前设置的 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 到 glEnd 之间的所有的点都绘制出来// 可以调用 glVertex3f 方法 成对 设置多条线// 注意必须成对设置 , 如果设置奇数个点 , 最后一个点会被丢弃// 绘制线段开始//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);// 上面的设置会从 (0,0,-10) 坐标向 (-5,0,-10) 坐标绘制一条线//glVertex3f(-5.0f, 0.0f, -10.0f);glVertex3f(-5.0f, -2.0f, -10.0f);// 上面的设置会从 (-5,0,-10) 坐标向 (-5,-2,-10) 坐标绘制一条线// 绘制点结束glEnd();// 将后缓冲区绘制到前台SwapBuffers(dc);





七、绘制彩色的线



在上面 六 的代码基础上 , 在绘制每个点之前 , 都设置当前的颜色值 , 即 OpenGL 状态机中的当前颜色值 ,

第一个点 glVertex3f(0.0f, 0.0f, -10.0f) , 绘制前设置的是 白色 ,

第二个点 glVertex3f(-5.0f, 0.0f, -10.0f) , 绘制前设置的是 绿色 ,

第三个点 glVertex3f(-5.0f, -2.0f, -10.0f) , 绘制前设置的是 蓝色 ;

设置颜色就是在点设置前调用 glColor4ub(0, 0, 255, 255) 方法 , 设置当前颜色 ;

白色的点绿色的点 之间连线时 , 颜色会从白色渐变到绿色 ;

代码如下 :

// 渲染场景// 清除缓冲区 , // 使用之前设置的 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 到 glEnd 之间的所有的点都绘制出来// 可以调用 glVertex3f 方法 成对 设置多条线// 注意必须成对设置 , 如果设置奇数个点 , 最后一个点会被丢弃// 绘制线段开始//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);// 设置绿色 glColor4ub(0, 255, 0, 255);glVertex3f(-5.0f, 0.0f, -10.0f);// 上面的设置会从 (0,0,-10) 坐标向 (-5,0,-10) 坐标绘制一条线// 设置蓝色glColor4ub(0, 0, 255, 255);//glVertex3f(-5.0f, 0.0f, -10.0f);glVertex3f(-5.0f, -2.0f, -10.0f);glColor4ub(255, 255, 255, 255);// 上面的设置会从 (-5,0,-10) 坐标向 (-5,-2,-10) 坐标绘制一条线// 绘制点结束glEnd();// 将后缓冲区绘制到前台SwapBuffers(dc);

运行效果如下 :

111 个点白色 , 第 222 个点绿色 , 第 333 个点蓝色 ;

线段 111 白色 ~ 绿色渐变 , 线段 222 绿色 ~ 蓝色渐变 , 线段 333 蓝色 ~ 白色渐变 , 这是 OpenGL 固定管线差值出来的颜色 ;





八、相关资源



GitHub 地址 : https://github.com/han1202012/OpenGL

博客源码快照 : https://download.csdn.net/download/han1202012/14740988

总结

以上是生活随笔为你收集整理的【OpenGL】十二、OpenGL 绘制线段 ( 绘制单条线段 | 绘制多条线段 | 依次连接的点组成的线 | 绘制圈 | 绘制彩色的线 )的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。