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


   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(type x1,type y1,type x2,type y2)

     void glRectv(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>(x,y,z,w);

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

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


    int glutBitmapWidth(void* font,int char)

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


    除了位图字体外,还有笔画字体

    void glutStrokeCharacter(void* font,int char)

    绘制字符char,笔画字体由font指定


    void glutStrokeWidth(void* font char)

    返回char的位宽


查询与错误

    OpenGL状态可通过一下几个函数查询

    void glGetBooleanv(GLenum name,GLboolean* value)


    void glGetIntegerv(GLenum name,GLboolean* value)


    void glGetFloatv(GLenum name,GLboolean* value)


    void glGetBDoublev(GLenum name,GLboolean* value)


    void glGetPointerv(GLenum name,GLboolean* value)


    GLboolean glIsEnabled(GLenum feature)

    取决于feature,返回GL_TRUE或GL_FALSE。


    GLenum glGetError()

    返回自初始化或最近一次调用该函数起,最近发生的错误的类型。如果没发生错误,则返回        GL_NO_ERROR


    GLubyte* gluErrorString(GLenum error)

    返回一个与glGerError()返回的错误对应的字符串信息


状态的保存

    矩阵栈堆用来保存投影矩阵和模型矩阵。

    void glPushMatrix()

    void glPopMatrix()

    依据当前矩阵模式使矩阵入栈或出栈。

    

    我么也可以将多组属性或全部属性通过函数压入栈中,绘图时会临时使用这些属性,不用时出栈则     可恢复至之前的属性

    glPushAttrib(GLbitfield mask)

    glPopAttrib()