关于直线

直线的绘制也很简单,与绘制点差不多,只不过两点绘制一条直线而已。

 

绘制直线需要向 glBegin() 函数传递绘制直线的参数:GL_LINES,该参数是绘制实线,如果需要绘制 点画线 或 折线 等等则需要传递其他参数,后面将介绍到。

 

既然我们能控制点在屏幕上显示的大小,那么对于直线是不是也应该能控制些什么呢,最容易想到也就是线宽了吧,的确我们是可以控制线宽的,呵呵,感觉像在自言自语,不过这种感觉挺好,我喜欢,不过为什么喜欢用“我们”呢,想知道为什么么,那你换成“我”再读读就知道了。。。

 

(一)下面介绍如何设置直线的宽度,其实与设置点的大小是一样的,所以不详细说了,我还没笨到那程度,你也是吧,不过你是谁。

                GLfloat fLineWidth[2];
	// 得到直线宽度范围
	glGetFloatv(GL_LINE_WIDTH_RANGE , fLineWidth);
	// 定义直线的宽度, 这里设置为 2 个象素宽
	glLineWidth(2.0f);

 

如上述代码显示的,我们是利用 glLineWidth() 函数来设置直线的宽度的,这种设置对后面介绍的 点画线 等等都是起到一样的作用的。

 

(二)点画线:

点画线 我们是通过设置直线的 线型 来实现的,假如我们把直线划分成很多小的基本直线段,每个基本直线段由 16 个连续的点组成,而这 16 个连续的点如果我们用 16 个二进制位来表示,如果对应的二进制位值为 0 则表示对应的点将不显示在屏幕即造成了空白段,如果对应的二进制位值为 1 则表示对应的点将显示,这样我们并能随自己意愿通过这 16 个二进制数来定义自己的 点画线基本直线段,而整条直线只不过是该基本直线段的不断重复而已。

可喜的是,opengl 里的线型确实是用 16 个二进制位来表示的,一般我们用 4 个 16 进制数写起来更方便些。不过有什么可喜的呢,只不过我是已经知道了 opengl 里面是这样表示的才象上面那段解释而已。。。

比如我们可以构造如下线型:

0000 0000 1111 1111  表示空白线和长折线

0000 0001 0000 0001  表示点

 

下面我将具体介绍如何绘制一条点画线:

为了对所定义的线型获得 opengl 的支持,必须事先启动改变线型的机制,如下:

// 启动改变线型的机制,使我们能自己改变线型 ,传入不同的参数可以启动很多不同的特定功能
glEnable(GL_LINE_STIPPLE);

 

然后我们就可以设置自己想要的线型了,如下设置为上面说过的 空白线与长折线 0000 0000 1111 1111:

	// 设置线型,线型是通过二进制值来表示的,可以自己设定此二进制值
	glLineStipple(1 , 0x00ff);

 

函数 glLineStipple() 的第一个参数数据类型为 GLint , 表示线型模式重复因子,重复因子说明了二进制表示的点的重复次数,比如如果重复因子是 2 ,一个 01010101 的线型事实上被当成 0011001100110011 线型来处理。第二个参数数据类型是 GLushort , 表示所定义的线型。

这样我们设置后若再绘制直线则为点画线而不是实线了,当然这样设置对后面所有的直线绘制都起到作用了,一般绘制完后应将线型再设置回实线,如: 

glLineStipple(1 , 0xffff);

 

点画线就说到这,下面简单介绍下 折线 和 闭合折线 的绘制

 

(三)折线,闭合折线:

我们绘制直线时是两点绘制一条直线,且这两点是不能重用的。当我们绘制折线时则不同了,只要是连续的两点都将绘制出一条直线,这样多条直线的首尾相接并形成折线了,不要在话上跟我钻没必要的空子,不然你做人一定挺累的。

 

绘制折线时向 glBegin() 函数传递参数 GL_LINE_STRIP 即可,

绘制闭合折线向 glBegin() 函数传递参数 GL_LINE_LOOP 即可,它将自动闭合,不用你多余操心了

阅读更多

没有更多推荐了,返回首页