Delphi下OpenGL2d绘图之画线的方法

所属分类: 软件编程 / Delphi 阅读数: 149
收藏 0 赞 0 分享

一、前言:

Delphi画线方法与画点基本上是相同的。区别在于glBegin()的参数。绘制的框架代码可以参考Delphi下OpenGL2d绘图初始化中的代码,地址为https://www.jb51.net/article/52141.htm。修改的部份为 Draw 函数的内容。

二、画线步骤:

GL_LINES:把每一个顶点作为一个独立的线段,顶点2n-1和2n之间共定义了n条线段,总共绘制N/2条线段
GL_LINE_STRIP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,第n和n+1个顶点定义了线段n,总共绘制n-1条线段
GL_LINE_LOOP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,然后最后一个顶点和第一个顶点相连,第n和n+1个顶点定义了线段n,总共绘制n条线段

画线可能用到以下函数:

glLineWidth() 设置线条宽度
glShadeModel() 设置颜色过渡模式
glColor3f() 设置线条颜色

procedure TForm1.Draw;
begin
  // 清空缓冲区
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  // ----------- GL_LINES -----------
  // 设置线宽
  glLineWidth(5);
  // 两点间渐变色
  glShadeModel(GL_SMOOTH);
  glBegin(GL_LINES);  // 画线
  // 设置起点线的颜色
  glColor3f(1, 0, 0);
  // 绘制起点
  glVertex2f(50, 50);
  // 设置末点线的颜色
  glColor3f(0, 0, 1);
  // 绘画末点
  glVertex2f(200, 200);
  glEnd;
  // 两点间同颜色
  glShadeModel(GL_FLAT);
  glBegin(GL_LINES);
  glColor3f(0, 1, 0);
  glVertex2f(200, 50);
  glColor3f(1, 1, 0);
  glVertex2f(50, 200);
  glEnd;
  // ----------- GL_LINE_LOOP -----------
  // 三个点闭环形成一个三角形  glShadeModel(GL_SMOOTH); 不起作用
  glLineWidth(1);
  glBegin(GL_LINE_LOOP);
  glColor3f(0, 0, 1);
  glVertex2f(250, 50);
  glVertex2f(250, 200);
  glVertex2f(280, 150);
  glEnd;
  // ----------- GL_LINE_STRIP -----------
  // 多点折线    glShadeModel(GL_SMOOTH); 不起作用
  glLineWidth(1);
  glBegin(GL_LINE_STRIP);
  glColor3f(1, 0, 255);
  glVertex2f(350, 50);
  glVertex2f(400, 200);
  glVertex2f(480, 150);
  glVertex2f(490, 60);
  glEnd;
  SwapBuffers(FDC); //交换双缓冲区内容,这将把刚绘制的图形翻印到屏幕上。
end;

可以看到第一个X线条颜色渐变的,OpenGL默认情况下是这种样式。opengl中提供了一个函数glShadeModel来决定如何处理这种不同颜色的情况。

glShadeModel(GL_SMOOTH); // 平滑方式,这也是opengl的默认处理方式,实现颜色渐变的效果
glShadeModel(GL_FLAT);  // 单色方式,线段的颜色以某一个顶点的颜色为准,由具体实现决定。为了避免不确定性,应尽量在多边形中使用同一种颜色

经过测试后发现,在GL_LINE_LOOP与GL_LINE_STRIP样式下,渐变效果无效!具体原因有待进一步查明。

另外,OpenGL提供了抗锯齿的功能,函数为

glEnable(GL_LINE_SMOOTH); //启用
glHint(GL_LINE_SMOOTH,GL_NICEST);
glDisable(GL_LINE_SMOOTH); //关闭

使用后发现抗锯齿效果不明显。有待进一步继续再研究。

完整代码点此下载

更多精彩内容其他人还在看

Delphi 常见文件处理及注册表文件的使用实例

这篇文章主要介绍了Delphi 常见文件处理及注册表文件的使用实例的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi实现获取进程列表及相关信息的实例

这篇文章主要介绍了Delphi实现获取进程列表及相关信息的实例,希望通过本文大家能实现这样的功能,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi 实现软件自动升级的功能

这篇文章主要介绍了Delphi 实现软件自动升级的功能的相关资料,希望通过本文能帮助到大家实现这样的功能,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi使用大图标编译程序的方法

这篇文章主要介绍了Delphi使用大图标编译程序的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi中使用ISuperObject解析Json数据的实现代码

这篇文章主要介绍了Delphi中使用ISuperObject解析Json数据的实现代码,需要的朋友可以参考下
收藏 0 赞 0 分享

Delphi菜单组件TMainMenu使用方法详解

这篇文章主要为大家详细介绍了Delphi菜单组件TMainMenu的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

为什么继续选择DELPHI(即将逝去的Delphi前景在何方)

已经钻DELPHI很深了,当然现在DELPHI是过了最辉煌的时代。但为什么要继续下去,而不转向其它的?这是不是死脑筋
收藏 0 赞 0 分享

Delphi 调用外部程序并阻塞到外部程序中

这篇文章主要介绍了Delphi 调用外部程序并阻塞到外部程序中的相关知识,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

修改 Delphi 10.3.3 IDE 字体和字体大小

Delphi,是Windows平台下著名的快速应用程序开发工具(Rapid Application Development,简称RAD)。这篇文章主要介绍了修改 Delphi 10.3.3 IDE 字体和字体大小,需要的朋友可以参考下
收藏 0 赞 0 分享

解决delphi TAdoQuery组件的close方法导致”列名无效“错误的问题

今天小编就为大家分享一篇解决delphi TAdoQuery组件的close方法导致”列名无效“错误的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
收藏 0 赞 0 分享
查看更多