OpenGL绘制
清除窗口
在计算机中,保存图片的内存通常被计算机所绘制的前一幅图像所填充,因此在绘制新场景之前,一般需要把它清除为某种背景颜色。
void glClearColor(GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha);
设置当前清除颜色,用于清除RGBA模式下的颜色缓冲区。其中red,green,blue和alpha值范围限定在[0,1],默认的清除颜色是(0,0,0,0),也就是黑色。
void glClear(GLbitfield mask);
用当前的缓冲区清除值清除指定的缓冲区。mask参数值表如下所示(若要清除多个缓冲区则运用位运算or):
缓冲区 名称
颜色缓冲区 GL_COLOR_BUFFER_BIT
深度缓冲区 GL_DEPTH_BUFFER_BIT
累积缓冲区 GL_ACCUM_BUFFER_BIT
模板缓冲区 GL_STENCIL_BUFFER_BIT
下面用红色清除窗口:
glClearColor(1.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
第一行代码把清除颜色设置为红色,第二行代码把整个窗口清除为当前清除颜色。
强制绘图
void glFlush(void);
强制以前发出的OpenGL命令开始执行,因此保证它们能够在有限的时间内完成。
画点
点:可以用一组称为顶点的浮点数表示。
glBegin(GL_POINTS); //选择点作为图元
glVertex3f(0.0f,0.0f,0.0f); //指定一个点
glVertex3f(50.0f,50.0f,50.0f); //指定另外一个点
glEnd(); //完成绘点
glBegin的参数GL_POINTS告诉OpenGL接下来的顶点将被用来画点。这里列出了2个顶点,它们将被解释为2个特定的点,并且都将被绘制。
这里有与glBegin和glEnd有关的一个重要概念:我们可以在它们之间列出多个图形,只要它们是相同类型的图元。即使用一个glBegin/glEnd序列可以随自己所愿包含许多个图元。
1. void glBegin(GLenum mode);
标志着一个顶点数据列表的开始,它描述了一个几何图元。mode参数指定了图元的类型,它可以下列值之一:
值 含义
GL_POINTS 单个的点
GL_LINES 一对顶点被解释为一条直线
GL_LINE_STRIP 一系列的连接直线
GL_LINE_LOOP 和上面相同,但第一个顶点和最后一个顶点彼此相连
GL_TRIANGLES 3个顶点被解释为一个三角形
GL_TRIANGLE_STRIP 三角形的连接串
GL_TRIANGLE_FAN 连接成扇形的三角形系列
GL_QUADS 4个顶点被解释为一个四边形
GL_QUAD_STRIP 四边形的连接串
GL_POLYGON 简单的凸多边形的边界
2. void glEnd(void);
标志着一个顶点数据列表的结束
画直线
直线:在OpenGL中,直线这个术语表示一段线段,而还是数学意义上的在两端无限延伸的直线。
glBegin(GL_LINES);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(50.0f,50.0f,50.0f);
glEnd();
上面代码在点(0,0,0)和(50,50,50)之间画了一条直线。注意,如果指定了奇数个顶点,则最后一个顶点会被忽略。
画多边形
多边形:由线段构成的单闭合环,其中线段是由它们的端点位置的顶点指定的。一般而言,多边形可能非常复杂。因此,OpenGL对基本多边形的构成进行了限制。首先,OpenGL多边形的各条边不能相交。其次,OpenGL多边形必须是凸多边形,也就是不存在内陷的部分。准确地说,在多边形的内部任意取两个点,如果连接这两点的线段都在这个多边形的内部,那么这个多边形就是凸多边形。
glBegin(GL_ TRIANGLES); //三角形也是多边形之一
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.0f,50.0f,0.0f);
glVertex3f(50.0f,0.0f,0.0f);
glEnd();
上面代码绘制了一个三角形,如果指定了绘图颜色的话,则该三角形将用该颜色进行填充。
由上可见,如果想要绘制图元时,先在glBegin中设置好想要的图元类型,然后将图形顶点按顺序排列即可(在OpenGL中,所有几何物体最终都描述成一组有序的顶点)。当然,在绘制图元时也可以控制它们的细节,如点的宽度、直线的宽度等。