首页 > 代码库 > OpenGL(一)二维图形的绘制:图元、多边形、颜色插值、文本、查询与错误、状态的保存

OpenGL(一)二维图形的绘制:图元、多边形、颜色插值、文本、查询与错误、状态的保存

图元三种基本类型:点、直线段、多边形。其他复杂的对象均是由这三种图元来构建。


   void glPointsize(GLfloat size)  //对点尺寸状态变量进行设定,单位为像素,默认值1.0

   注:glPointSize()不能放置在glBegin()和glEnd()函数之间。


直线

    glBegin(mode) 绘制直线时,mode可取下列值:

    GL_LINES:glBegin()和glEnd()函数之间每两个连续顶点绘制一条线段。

    GL_LINE_STRIP:首尾相接的线段。

    GL_LINE_LOOP:首尾相接,且最后一个顶点与第一个顶点也相连接。


    直线的属性包括颜色、线宽、以及模式(创建虚线和点划线)

    

    void glLineWidth(GLfloat width) //设置线宽,默认1.0

    void glLineStipple(GLint factor,GLushort pattern)  //pattern是一个16位进制的数,从低       位开始读取,若位数上位1,则绘制像素点,为0则不绘制,factor是重复绘制的次数


启用OpenGL特性

    OpenGL有许多绘制功能,如光照、消隐、纹理映射等。每种特性都将影响绘制处理速度,因此很多特性默认都是禁用的,若需要使用则在开启,不用则关闭。

    void glEnable(GLenum feature)

    void glDisable(GLenum feature)

    //启用或禁用OpenGL中某个特性


    例如,在上例中若要绘制点划线,必须先要开启点划模式glEnable(GL_LINE_STIPPLE)

    

    注:使用某种特性之前不要忘记首先开启该特性。否则即使设定相关参数也是徒劳的。


填充的图元

    具有内部区域的图元在显示时都可以以某种颜色或模式进行填充。glBegin()的参数可以为下:

     GL_POLYGON:绘制一个凸多边形

     GL_TRIANGLE:(P0,P1,P2),(P3,P4,P5),(P6,P7,P8),多余的顶点将被忽略。

     GL_TRIANGLE_STRIP:(P0,P1,P2),(P1,P2,P3),(P2,P3,P4).....

     GL_TRIANGLE_FAN:(PO,P1,P2),(P0,P2,P3),(P0,P3,P4).......

     GL_QUADS:(P0,P1,P2,P3),(P4,P5,P6,P7)..........

     GL_QUAN_STRIP:(P0,P1,P2,P3),(P2,P3,P4,P5)..........


矩形:

    void glRect<sidf>(type x1,type y1,type x2,type y2)

     void glRect<sidf>v(type* v1,ytpe* v2)


多边形的点划模式:

    glEnable(GL_POLYGON_STIPPLE)

     void glPolygonStipple(const Glubyte * mask)  mask为32*32位


多边形类型

    OpenGL中,一个多边形可以以三种不同的方式进行显示:填充方式、边线方式或与顶点对应的点集方式。而二维多边形实际上具有两个面:正面和背面。对于这些面,OpenGL可部分或全部绘制。

    默认情况下,若沿着观察方向看,多边形的绕序为逆时针方向,则该面为正面,否则为背面。


    void glPolyMode(GLenum face,GLenum mode)

    指定表面(GL_FRONT、GL_BACK、GL_FRONT_AND_BACK)如何进行绘制(GL_POINT、GL_LINE、             GL_FILL)。默认对正面和背面均进行填充。


    我们也可以不对表面中的某一个或全部进行绘制。

    void glCullFace(GLenum mode)

    在绘制时忽略(GL_FRONT、GL_BACK、GL_FRONT_AND_BACK)


    void glFrontFace(GLenum mode)

    逆时针(GL_CCW)或顺时针(GL_CW)定义为正面朝向


    void glPolygonOffset(GLfloat factor,GLfloat units)

    设置多边形边线的偏移量。偏移量可正可负,可为任意模式的多边形启用。

    glEnable(GL_POLYGON_OFFSET_LINE)


颜色插值

    先看段代码:

    glBegin(GL_LINES);
        glColor3f(1.0,0.0,0.0);
        glvertex2f(1.0,1.0);
        glColor3f(0.0,0.0,1.0);
        glvertex2f(0.0,1.0);
     glEnd();

    上述代码中,两个顶点被定义为红色和蓝色。但是OpenGL将以何种颜色绘制这些顶点之间的点呢?

默认情况下,OpenGL将使用平滑着色,通过两端的点进行插值。还有一种模式为平面模式,以最后一个顶点的颜色进行着色。

    void glShadeModel(GLenum mode)

    将明暗模型设置为平滑模式(GL_SMOOTH)或平面模式(GL_FLAT)。默认为平滑模式。


离散处理与边标记

    若要生成非凸多边形时,可以讲非凸多边形离散成多个三角形处理,若要填充显示则没什么问题,但若只想边显示时,就会在非凸多边形内部多绘制了几条边。解决办法是借助glEdgeFlag*()。若该标记设为GL_TRUE。则每个顶点都被认为是所想要显示的线段的起点;若标记GL_FALSE,则构成虚假边的顶点将不被显示。

        void glEdgeFlag(GLboolean flag)

        void glEdgeFlagv(GLboolean* flag)


文本:

    void glutBitmapCharacter(void* font,int char)

    font指定字体绘制字符char,其中字符char由ASCII给出

    

    例如:

     glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_10,‘a‘)  //得到Times-Romans的10磅位图字符a

     glutBitmapCharacter(GLUT_BITMAP_8_BY_13,‘a‘) //8*13的字符a


    字符出现的位置由光栅位置决定,这个位置决定了下一副位图的左下角在屏幕的位置。

    void glRasterPos<234><sidf>(x,y,z,w);

    void glRasterPos<234><sidf>v(type* array);

    绘制一个位图后光栅自动会有一个偏移量,不会绘制到之前的位置上。


    int glutBitmapWidth(void* font,int char)

    返回由font指定的GLUT字体的字符char的像素宽度。


    


OpenGL(一)二维图形的绘制:图元、多边形、颜色插值、文本、查询与错误、状态的保存