OpenGL线属性函数
可以用颜色、线宽和线型等三个属性设定来控制OpenGL直线段的外在表示。我们已经看到了如何选择颜色,OpenGL还提供了一个设定线宽的函数和另外一个设定短划或点线等线型的函数。
OpenGL线宽函数
使用下面的OpenGL函数可以设定线宽:
glLineWidth (width);
参数width赋以实数,该值舍入到最近的非负整数。如果输人值舍入到0.0,则线段用默认的标准宽度1.0显示。然而,在对线段进行反走样时,其边界进行光滑处理以减少阶梯现象,因而有可能出现小数宽度。有些线宽函数的实现仅支持有限的几种线宽,其他一些则不支持1.0以外的线宽。
OpenGL的线宽函数用4.5节的方法实现。即通过比较线段端点的水平和垂直距离Δx和Δy来确定使用垂直段或水平段来生成粗线段。
OpenGL线型函数
默认状态下,直线段显示成实线。但也可以显示划线、点线或短划和点混合的线段。还可改变短划及短划或点之间的长度。可以利用下面的OpenGL函数设定当前线型:
glLineStripple(repeatFactor,pattern);
参数pattern用来引入描述如何显示线段的一个16位整数。值为1的位对应一个“开”像素,值为0的位对应一个“关”像素。该模式从低位开始应用于线路径。默认模式为0xFFFF(每一位的值均为1),它生成实线。整数参数repeatFactor说明模式中每一位重复应用多少次才轮到下一位。默认的重复值是1。
对于一条折线来说,指定的线型模式并非在每一线段的始端重新开始。它从折线的第一个端点开始,到最后一条线段的最终一个端点结束,连续地应用于折线中的所有线段。
作为指定一个线型的例子,假定参数pattern赋予了十六进制数0x00FF而重复因子为1。这将显示一条由8像素短划和8像素短划间隔的划线。同样,由于先应用低位值,线段从始端开始显示一个8像素短划,接着是一个8像素间隔,然后再显示一个8像素短划,如此知道第二个端点。在使用当前线型显示线段之前,必须先激活OpenGL的线型特性。下面的函数可实现这一点。。
glEnable(GL_LINE_STIPPLE);
如果忘记使用这一激活函数,则显示实线;即使用默认模式0xFFFF显示线段。在任何时候都可以使用下列函数来关闭线型特性:
glDisable(GL_LINE_STIPPLE);
该函数使用默认模式(实线)取代当前线型。
在一下面的程序中,通过绘制三条不同线型和线宽的线段来展示OpenGL线属性函数的应用。
图4.16给出了可由该程序生成的数据图。
/* Define a two-dimensional world-coordinate data type. */ typedef struct { float x, y; } wcPt2D; wcPt2D dataPts [5]; void linePlot (wcPt2D dataPts [5]) { int k; glBegin (GL_LINE_STRIP); for (k = 0; k < 5; k++) glVertex2f (dataPts [k].x, dataPts [k].y); glFlush (); glEnd (); } /*Invoke a procedure here to draw coordinate axes. */ glEnable (GL_LINE_STIPPLE); /* Input first set of (x, y) data values. */ glLineStipple (1, 0x1C47); // Plot a dash-dot, standard-width polyline. linePlot (dataPts); /* Input second set of (x, y) data values. */ glLineStipple (1, 0x00FF); // Plot a dashed, double-width polyline. glLineWidth (2.0); linePlot (dataPts); /* Input third set of (x, y) data values. */ glLineStipple (1, 0x0101); // Plot a dotted, triple-width polyline. glLineWidth (3.0); linePlot (dataPts); glDisable (GL_LINE_STIPPLE);