多边形面的绘制

OpenGL绘制多边形面

 计算机图形学(http://cs.hust.edu.cn/webroot/courses/csgraphics/jiaocai.php?bookpage=5_g_c)


OpenGL绘制的多边形面主要有三角形面、四边形面和多边形面。

    (1)三角形面
    三角形可能是最简单的多边形,它有三条边。可以使用GL_TRIANGLES模式绘制三角形,在这种模式下,每三个顶点指定一个新三角形,如果顶点个数不是三的倍数,多余的顶点将被忽略。程序5-1绘制了一个三角形:

程序5-1 OpenGL绘制三角形的例子
glBegin(GL_TRIANGLES);
 glVertex2f(0.0,0.0);
glVertex2f(15.0,15.0);
glVertex2f(30.0,0.0);
glEnd();

使用GL_TRIANGLE_STRIP模式可以绘制几个相连的三角形,系统根据前三个顶点绘制第一个多边形,以后每指定一个顶点,就与构成上一个三角形的后两个顶点绘制新的一个三角形。使用GL_TRIANGLE_FAN模式可以绘制一组相连的三角形,这些三角形绕着一个中心点成扇形排列。第一个顶点构成扇形的中心,用前三个顶点绘制出最初的三角形之后,随后的所有顶点都和扇形中心以及紧跟在它前面的顶点构成下一个三角形,此时以顺时针方向推进绘制顶点。这两种模式绘制的三角形面如图5-42所示。


(a)GL_TRIANGLE_STRIP模式   

(b)GL_TRIANGLE_FAN模式
图5-42 三角形面绘制模式

    (2)四边形面
    OpenGL提供了GL_QUADS和GL_QUADS_STRIP两种模式。GL_QUADS模式中每四个顶点一组用于构造一个四边形,如果顶点个数不是四的倍数,多余的顶点将被忽略;而GL_QUADS_STRIP模式中,在第一对顶点之后的每对顶点,都与其前面的一对顶点一同定义一个新的四边形。

    (3)多边形面
    OpenGL提供的GL_POLYGON模式可以将指定的顶点顺序连接,并将最后一个顶点自动连接到第一个顶点以确保多边形是封闭的。但是,这种绘制模式并不能绘制任意多边形,必须遵循两条规则:第一条规则是多边形必须是平面的,也就是说,定义多边形的所有顶点必须位于一个平面上,不能在空间中扭曲。第二条规则是多边形的边缘决不能相交,而且多边形必须是凸的。即多边形是不自相交的多边形,并且任意经过多边形的直线进入和离开多边形的次数不超过一次。

 

面的属性

 

    (1)多边形面的正反属性
    与数学意义的面不同的是,图形学中的多边形面有正面和反面之分,该属性由多边形的“绕法”决定。在绘制多边形的过程中,指定顶点的过程是有序的,即多边形的构成路径具有方向性,通常把指定顶点时顺序和方向的组合称为“绕法”。绕法是任何多边形图形的一个重要特性。一般默认情况下,OpenGL认为逆时针绕法的多边形是正对着的,这一特性对于希望给多边形的正面和背面赋予不同的物理特性十分有用。如果要修改OpenGL的默认行为,可以调用函数:
        glFrontFace(GL_CW);
CL_CW告诉OpenGL应该认为顺时针缠绕的多边形是正对着的。为了改回把逆时针绕法视为正面,可以使用参数CL_CCW调用glFrontFace函数。

    (2)多边形面的颜色
    在绘制多边形时,常常要指定绘制的颜色。而在OpenGL中,颜色实际上是对各个顶点而不是对各个多边形指定的。多边形的轮廓或者内部用单一的颜色或许多不同的颜色来填充的处理方式称为明暗处理。在OpenGL中,用单一颜色处理的称为平面明暗处理(Flat Shading),用许多不同颜色处理的称为光滑明暗处理(Smooth Shading),也称为Gourand 明暗处理(Gourand Shading),设置明暗处理模式的函数为:
       void glShadeModel(GLenum mode);
其中参数mode的取值为GL_FLAT或GL_SMOOTH,分别表示平面明暗处理和光滑明暗处理。应用平面明暗处理模式时,多边形内每个点的法向一致,且颜色也一致,OpenGL用指定多边形最后一个顶点时的当前颜色作为填充多边形的纯色;应用光滑明暗处理模式时,多边形每个点的颜色需要进行插值处理,故呈现不同的颜色。

    (3)多边形的显示模式
    函数glPolygonMode允许把多边形渲染为填充的实心、轮廓线或只是点。另外,可以把这项渲染模式应用到多边形的两面或只应用到正面或背面。使用下面的函数设置多边形的显示模式:
        glPolygonMode(Glenum face,Glenum mode);
其中,参数face指定多边形的哪一面受模式改变的影响——GL_FRONT,GL_BACK或GL_FRONT_AND_BACK。参数mode用于指定新的绘图模式。GL_FILL是默认值,生成填充的多边形;GL_LINE生成多边形的轮廓;而GL_POINT只画出顶点。

    (4)多边形面的填充
    多边形面既可以用纯色填充,也可以用32×32的模板位图来填充。为此,需使用函数:
        void glPolygonStipple(const GLubyte *mask);
指定用于填充多边形的模板位图。其中,mask是一个指向32×32位图的指针,该位图由0和1组成掩码,1表示绘制多边形对应像素,0表示不绘制。模板位图创建时,参数mask通常是依照从左至右,然后从下至上的顺序使用单个字节,而每个字节都是从最高位开始使用的。
    然后,调用函数:
        glEnable(GL_POLYGON_STIPPLE);
启用多边形填充模式。当然,也可以用参数GL_POLYGON_STIPPLE调用glDisable函数禁用填充模式。

    (5)多边形面的法向量
    在OpenGL中,可以为每个顶点指定法向量,如果多边形各个顶点的法向量一致,那么该多边形是平面多边形;如果多边形各个顶点的法向量不相同,那么这个多边形是一个曲面。同时,在OpenGL中不能自动计算法向量,需要由用户显式指定。而法向量的计算是一个几何问题,例如多边形的法向量可以利用不在同一条直线上的三个点构成两个矢量的叉积确定。
    法向量可以用下面的函数指定:
        void glNormal3{bsidf} ( TYPE nx, TYPE ny, TYPE nz);
        void glNormal3{bsidf}v (const TYPE* v);
其中,该函数的非向量版本(有3个参数)中参数nx,ny,nz指定法向量的x,y和z坐标,其默认值为(0,0,1)。该函书的非向量版本(仅有1个参数)中参数v为一个包含3个元素的数组,用于指定当前法向量。指定的当前法向量将被赋予随后指定的顶点。
    由于法向量只用于确定方向,因此其长度无关紧要,可以为任意长度。但是在光照计算时,需要使用长度为1的法向量。这里可以使用函数:
        glEnable(GL_NORMALIZE);
启用自动规格化法向量,使得指定的法向量长度为1。但自动规格化需要额外的计算,可能会降低应用程序的性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值