Delphi下OpenGL2d绘图之画线的方法

一、前言:

Delphi画线方法与画点基本上是相同的。区别在于glBegin()的参数。绘制的框架代码可以参考Delphi下OpenGL2d绘图初始化中的代码,地址为http://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); //关闭

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

完整代码点此下载

(0)

相关推荐

  • php绘图中显示不出图片的原因及解决

    php绘图首先要确认gd库是否启用,到php.ini文件中,找到extension=php_gd2.dll将前面的:去掉,重新启动服务器. 如果在绘图中还是没有显示正常的图片,说明服务器在回复请求时,图片的信息有误,要保证不要<?php?>前面不要有任何东西,包括html. 另外还不出图片,在绘图前清一下缓存(也就是在写header之前),先写ob_clean(); 然后就可以显示了(包括编写文件下载的时候,出现下载后打不开文件时,也需要清一下缓存).

  • VB实现鼠标绘图实例代码

    本文所述为VB实现鼠标绘图的实例,该实例实现线条颜色和线宽可自设,当按下鼠标按键时绘图开始并记录最初的起点,如果不是处在绘图状态则退出该过程,如果处在绘图状态则从起点到目前鼠标所在点绘制直线,然后将当前鼠标所在点作为新的起点,当释放鼠标按键时绘图结束. 具体的功能代码如下: VERSION 5.00 Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "comdlg32.ocx" Begin VB.For

  • VB实现屏蔽文本框右键菜单的复制、粘贴等功能的方法

    本文实例讲述了VB屏蔽文本框中的右键菜单.复制.粘贴等功能的实现方法.该功能就是禁止文本框的右键功能,造成点击鼠标右键无效.是非常常见的一类实用功能. 具体的功能模块代码如下: '========================================================== '| 模 块 名 | TextBoxDisableAbility '| 说 明 | 禁止文本框的功能 '=================================================

  • VB读取线程、句柄及写入内存的API代码实例

    本文所述实例为VB读取内存.线程及句柄的一个API,对涉及系统底层操作的VB编程有一定的帮助,需要的读者可以参考使用.这个API可获取到线程ID,写内存,包括进程句柄,ByVal 内存区地址,数据,总长度,已经完成长度,读取进程,包括进程句柄,ByVal 内存区地址,读取来的数据存放处,要读取的长度,已经读取的长度,内存分配(进程柄,地址[好像只要丢个0进去就行],长度,权限1[MEM_COMMIT],权限2[PAGE_READWRITE])返回:分配到的内存起始地址等功能. 具体实现代码如下:

  • 用VBS控制鼠标的实现代码(获取鼠标坐标、鼠标移动、鼠标单击、鼠标双击、鼠标右击)

    怎么用VBS模拟鼠标左键单击.左键双击.右键单击?-- 网上搜到的答案普遍是VBS无法实现,或者是要用第三方COM(ActiveX?)组件.我对第三方组件是很反感的,使用第三方组件毫无可移植性可言,因为别人的系统中不一定注册了这个组件.我的建议是,尽量不要在VBS代码中调用第三方组件,除非你的程序只是写来自己用.(顺便说一下,也尽量不要用不靠谱的Sendkeys方法,原因不解释) 好了,废话就说这么多,现在说说用VBS控制鼠标的方法.我以前写过一篇<VBS调用Windows API函数>,本以

  • VB调用Word拼写检查功能实例

    众所周知,Word有自带的拼写检查功能.VB中想要实现调用 Word 拼写检查功能其实很简单就可以实现,方法是先建立word对象,然后把需要检查的字符串放到 WORD中,调用word拼写检查,再取出返回值,最后关闭对象. 各个步骤的具体实现代码如下所示: Function CheckSpell(IncorrectText as string) as string Dim Word As Object, retText$ On Error Resume Next '建立WORD对象并打开 Set

  • Android 通过onDraw实现在View中绘图操作的示例

    Android绘图操作,通过继承View实现,在onDraw函数中实现绘图.下面是一个简单的例子: 复制代码 代码如下: public class AndroidTest extends Activity {    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(save

  • VB实现的倒计时类代码详解

    本文所述为用VB制作倒计时程序用到的一个Module类代码,是基于控制台的倒计时程序,可供VB初学者或者VB爱好者参考学习,当然读者也可以将其拷贝代码到VB工程里面直接使用,不过需要自己创建相关的代码,对于初学者来说,也是很容易看懂的一段代码. 具体功能代码如下: Module Module1 Sub Main() Dim a As Date Dim h, m, s As Integer Dim n, i As Long Dim x, z As Long Dim y As Long Consol

  • VB使用XMLHTTP实现Post与Get的方法

    本文所述为visual basic6.0的一个模块方法,是使用XMLHTTP实现Post与Get功能,虽然是一个老代码,但是可以替代Inet控件,实现数据通讯.很值得学习借鉴一下. 主要模块代码如下: '========================================================== '| 模 块 名 | XMLHTTP '| 说 明 | 替代Inet控件,实现数据通讯 '============================================

  • python海龟绘图实例教程

    本文以实例形式介绍了python turtle模块即海龟绘图的使用方法,对于需要进行图形编程的朋友相信会有一定的借鉴价值. python turtle模块简介:  python2.6版本中引入的一个简单的绘图工具,叫做海龟绘图(Turtle Graphics) 1.使用海龟绘图首先我们需要导入turtle,如下所示: from turtle import * #将turtle中的所有方法导入 2.海龟绘图属性: (1)位置  (2)方向  (3)画笔(画笔的属性,颜色.画线的宽度) 3.操纵海龟

随机推荐