绘图工具箱
清除窗口
在计算机中,保存图片的内存通常被计算机所绘制的前一幅图像所填充,因此在绘制新场景之前,一般需要把它清除为某种背景颜色。
- glClearColor()函数和glClear()函数
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 | 存储了经过图形流水线一系列处理测试后最终生成的像素颜色值,也就是最终在显示屏上显示颜色的GPU显存区域。 |
深度缓冲区 | GL_DEPTH_BUFFER_BIT | 存储了每个像素的深度值。通过深度缓冲区的数值可以进行深度测试,确定像素的遮挡关系,提高渲染效率。 |
累积缓冲区 | GL_ACCUM_BUFFER_BIT | 将渲染到颜色缓冲区的值重复拷贝到累积缓冲区,每次可以用不同的方式与当前累积缓冲区的内容混合,完成后拷贝回颜色缓冲区,通过swapbuffers显示。 |
模板缓冲区 | GL_STENCIL_BUFFER_BIT | 通过设置每个像素位的值,确定该点像素是否被渲染。 |
在发出命令清除多个缓冲区之前,如果想使用的并不是默认的RGBA值、深度值、累积值和模板索引值,就必须为每个缓冲区设置需要清除的值。除了glClearColor和glClearDepth以外还可以使用glClearIndex清除相应缓冲区的颜色索引、glClearAccum清除相应缓冲区的累积颜色、glClearStencil清除相应缓冲区的模板索引值。
OpenGL允许同时清除多个缓冲区,因为清除是一种相对较慢的操作,涉及窗口中的每个像素。有些图形硬件允许同时清除一组缓冲区,如果不支持同时清除多个,则硬件会线性地执行这些清除操作。
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
和
glClear(GL_COLOR_BUFFER_BIT);
glClear(GL_DEPTH_BUFFER_BIT);
两者等价,但是前者执行速度更快。
指定颜色
一般而言,首先设置颜色或颜色方案然后再绘制物体,在这种颜色或颜色方案被修改之前,所有物体都用这种颜色或这种颜色方案进行绘制。函数:glColor3f();。
强制完成绘图操作
void glFlush(void);
强制以前发出的OpenGL命令开始执行,因此保证它们能够在有限的时间内完成。
void glFinish(void);
强制以前发出的OpenGL命令完成执行。在以前的命令完成执行之前,这个函数不会返回。
坐标系统工具
在打开窗口、移动窗口或改变窗口大小的时候,窗口系统都会发送一个事件作为通知。如果使用的是GLUT,它会自动产生,并且在glutReshapeFunc()中注册的回调函数会被调用。回调函数会完成以下两个任务:
- 重新建立一个矩形区域,把它作为新的渲染画布
- 定义一个用于绘制物体的坐标系统
描述点、直线和多边形
OpenGL的点、直线、多边形
点
用一组称为顶点的浮点数表示。
直线
表示一段线段。任何构成连线系列的直线都是根据他们的端点(顶点)指定的。
多边形
由线段构成的单闭合环,其中线段是由他们的端点位置的顶点指定的。
注:OpenGL多边形的各条边不能相交(即为简单多边形);OpenGL多边形必须是凸多边形,也就是不存在内陷的部分(在多边形内部任意取两个点,如果连接这两个点的线段都在这个多边形内部,则这个多边形就是凸多边形)。
矩形
OpenGL提供了填充矩形图元函数glRect*()。
void glRect{sifd}(TYPE x1.TYPE y1,TYPE x2.TYPE y2);
void glRext{sifd}v(const TYPE *v1,const TYPE *v2);
绘制由角顶点(x1,y1)和(x2,y2)定义的矩形这个矩形位于z=0的平面上,并且它的边与x和y轴平行。第二个式子是该函数的向量形式,角顶点是由两个数组指针指定的,它们分别包含了一对(x,y)坐标值。
曲线和弯曲表面
通过组合大量的短直线或小多边形来模拟曲线或弯曲表面。
指定顶点
在OpenGL中,所有的几何物体最终都描述成一组有序的顶点。glVertex*()函数用于指定顶点。
void glVertex[234]{sifd}(TYPE coords);
void glVertex[234]{sifd}v(const TYPE* coords);
指定了一个用于描述几何物体的顶点。
[234]:提供2个坐标(x,y),或提供3个坐标(x,y,z),或提供4个坐标(x,y,z,w);
{sifd}:short,int,float,double;
例如:
glVertex3d(0.0,0.0,3.1415926535898);
glVertex4f(2.3,1.0,-2.2,2.0);
GLdouble dvect[3]={5.0,9.0,1992.0};
glVertex3dv(dvect);
OpenGL几何图元
把一组顶点放在一对glBegin()和glEnd()之间,根据传递给glBegin()的参数,这些顶点能够构建不同形状的几何图元。
void glBegin(GLenum mode);
标志着一个顶点数据列表的开始,描述了一个几何图元。mode参数指定了图元的类型
值 | 含义 |
---|---|
GL_POINTS | 单个的点 |
GL_LINES | 一对顶点构成一条直线 |
GL_LINE_STRIP | 一系列相连的直线 |
GL_LINE_LOOP | 同上,但是第一个顶点和最后一个顶点会相连形成闭合循环 |
GL_TRIANGLES | 三个顶点构成三角形(v0v1v2/v3v4v5/v6v7v8/…) |
GL_TRIANGLE_STRIP | 三角形的连接串 (v0v1v2/v2v1v3/v2v3v4/…) |
GL_TRIANGLE_FAN | 连接成扇形的三角形 (v0v1v2/v0v2v3/v0v3v4/…) |
GL_QUAD_STRIP | 四个顶点构成一个四边形 |
GL_POLYGON | 简单的凸多边形 |
void glEnd(void);
标志着顶点数据列表的结束。
除非被编译到一个显示列表中,否则所有的glVertex*()函数都应该出现在glBegin()和glEnd()之间,如果出现在其他地方就不会有任何效果。如果编译到了一个显示列表中,那这个显示列表应该出现在glBegin()和glEnd()之间。
基本状态管理
物体在进行渲染时可能会使用光照、纹理、隐藏表面消除、雾以及其他影响物体外观的状态,为了打开或关闭这些状态,可以使用下面这两个简单的函数:
void glEnable(GLenum capability);
void glDisable(GLenum capability);
可以向这两个函数传递超过60个的枚举值作为参数,比如
GL_BLEND(用于控制RGBA颜色的混合)
GL_DEPTH_TEST(用于控制深度比较,并对深度缓冲区进行更新)
GL_FOG(控制雾)
GL_LINE_STRIPPLE(直线的点画模式)
GL_LIGHTING(光照)
GLboolean glIsEnabled(GLenum capability);
查询并返回被查询状态是否启用
显示点、直线和多边形
点的细节
void glPointSize(GLfloat size);
设置被渲染的点的宽度,以像素为单位。size必须大于0.0,默认为1.0。
关于“抗锯齿”
如果抗锯齿功能禁用,那么带小数的宽度值将四舍五入为整型值,在屏幕上绘制的是对齐的正方形像素区域。
如果抗锯齿功能或者多重采样启用,那么非整形的宽度值不会被四舍五入,且位于边界的像素所使用的颜色强度会相对变小,使得边缘更加光滑。
直线的细节
在OpenGL中,可以指定不同宽度的直线,也可以指定不同点画模式的直线,比如点线(doottedline)、用点和短直线交替绘制而成的段线(dash line)等。
** void glLineWidth(GLfloat width);**
以像素为单位设置宽度,用于直线的渲染。
默认情况下直线宽度为1个像素,所以在低分辨率的屏幕上看起来会显得更粗一点。
** void glLineStripple(GLint factor,GLushort pattern);
pattern是一个由1或0组成的16位序列。从低位开始按照像素进行处理,对应位是1就绘制该像素,不是1就不绘制该像素。
factor表示重复因子,它与1和0的连续子序列相乘。