本文介绍绘制多边形的基本语句。
OpenGL提供了描述点、线、多边形的机制。它们通过glBegin()和glEnd()的配对
来完成。glBegin()有一个GLenum的参数,它可以为如下10个常量:
GL_POINTS,GL_LINES,GL_LINE_STRIP(折线),
GL_LINE_LOOP(封闭线),GL_TIANGLES,
GL_TRIANGLE_STRIP(连续画三角),GL_TRIANGLE_FAN(三角形扇),
GL_QUADS,GL_QUAD_STRIP,GL_POLYGON
当glBegin()函数的参数为GL_POINTs时,表示在glBegin()和glEnd()函数对之间将
绘制点。如:
glBegin(GL_POINTS)
glVertex2f(0.0f,0.0f);//定义二维点
glVertex3f(0.1f,0.2f,0.3f);//定义三维点
glEnd();
为了获取被设备支持的点的大小的范围,OpenGL提供了glGet()函数,采用如下语句获
得点的大小范围。
GLfloat fPointSize[2];
glGetFloatv(GL_POINT_SIZE_RANGE,fPointSize);
glGetFloat()函数的第一个参数必须是OpenGL常量,第二个参数是数组的地址。函数按第一个参数的指示向第二个参数所指地址传输数据,fPointSize[0]存储点的大小的最小值,fPointSize[1]存储点的大小的最大值。
(1)采用如下语句获取当前点的大小
GLfloat fCurrentPointSize;
glGetFloatv(GL_POINT_SIZE,&fCurrentPointSize)
(2)将glBegin()函数的参数设为GL_Lines,便可以用glBegin()/glEnd()函数lai绘制直线。如:
glBegin(GL_LINES)
glVertex2f(0.4f,0.4f);
glVertex2f(0.0f,-0.4f);
glEnd();
通过glLineWidth()来自定义线的宽度,如:glLineWidth(2.0f)申明了两个像素作为线的宽度
(3)通过如下语句确定线的宽度:
GLfloat fLineWidth[2];
glGetFloatv(GL_LINE_WIDTH_RANGE,fLineWidth);
fLineWidth中存放线宽的最小值和最大值。
(4)OpenGL通过glLineStipple()函数来获取所定义的线型。
(5)为了使所获取的线型被OpenGL支持,必须事先启动改变线型的机制
glEnable(GL_LINE_STIPPLE);
当不再使用自定义的线型时,应将功能关闭
glDisable(GL_LINE_STIPPLE);
(6)在OpenGL中,glEnable()是一个重要的函数,通过该函数可以启动OpenGL的许多特定功能。
(7)glBegin()函数的参数为GL_LINE_LOOP时在glBegin()和glEnd()之间绘制闭合折线。
glBegin(GL_LINE_LOOP)
glVetex2f(-0.3f,0.0f);
glVetex2f(0.8f,0.0f);
glVetex3f(0.0f,0.8f);
glEnd();
此处折线的闭合由函数完成,最后一个点不必是第一个点。
(8)在OpenGL中,一个多边形至少有3个顶点。直线不能相交,多边形应构成单连通
的凸区域。一个多边形有前面和后面之分,前面和后面可以有不同的属性。
(9)一个多边形的前面和后面是需要指定的,可以通过其顶点的顺序来确定,缺省的逆
时针排列的顶点定义的多边形是前面的。
(10)OpenGL提供函数glFrontFace()来指定多边形的前面。函数参数只能为GL_CW或
GL_CCW,
GL_CW表示按顺时针定义的多边形是前面的,
GL_CCW表示按逆时针定义的多边形是前面的。
(11)OpenGL允许用户采用一个32*32的位图对多边形进行填充。
(12)位图可以用如下结构定义:
Glubyte polygonFillPattern[]={ };
(13)一旦完成模式的自定义,就可以用glEnable(GL_POLYGON_STIPPLE)通知OpenGLdui改变了的填充模式进行响应。
(14)如果要回到通常的填充模式,只需用用glDisable(GL_POLYGON_STIPPLE)终止自定义的填充模式。
(15)应用多边形填充模式,可以进行半透明处理,淡入淡出效果处理等。
(16)用GL_TRIANGELS来完成三角形的绘制。
glBegin(GL_TRIANGLES)
glVertex2f(-0.5f,0.4f);
glVertex2f(-0.6f,-0.5f);
glVertex2f(0.5f,-0.5f);
glEnd();
(17)当glBegin()的参数为GL_TRIANGLE_STRIP时,可以画一系列的三角形,称其为三角形片。在glBegin()/glEnd()函数对中,采用顶点描述三角形时,前三个顶点描述了第一个三角形,之后每加入一个顶点就延伸出一个三角形,第二个三角形由第二三四三个顶点构成。
(18)在OpenGL中,可以用多个三角形构成三角形扇,glBegin()/glEnd()函数对的前三个顶点定义了第一个三角形,自后每增加一个顶点就增加一个三角形,由第一个顶点作为扇心。
(19)应用GL_QUADS参数可以画一组四边形,绘制时要注意四边形顶点的排列顺序。
(20)应用参数GL_QUAD_STRIP,在glBegin()/glEnd()函数对中,前四个顶点定义第一个四边形,之后每加入两个顶点就加入一个四边形。
(21)要绘制如图所示的凹多边形,可用通过绘制两个组合的四边形,但是会产生一条本不存在的边3-4,因而需要对这条边加以隐藏。
(22)OpenGL通过glEdgeFlag()函数来说明边的可见性。该函数位于两个glVertex()函数之间,说明由这两点构成的边的可见性。参数为TRUE可见,FALSE不可见。
(23)一旦确定了glEdgeFlag()函数的参数,此后所绘制的边的可见性就不会发生改变,除非再次调用glEdgeFlag()函数。
(25)一个物体无论其表面形状多么复杂,计算机都将它视为由若干个小面组成的,通常小面采用三角形或四边形。
首先对曲面进行网格划分,称有限单元化;其次要获得网格的各个顶点坐标,并对顶点进行数学描述形成单个面,通过面循环构成整个物体的拓扑结构;对顶点赋予颜色、纹理、法线等信息;最后将以上操作的结果作为输入信息传递给OpenGL。