上一篇大概介绍了GLUT这个库,介绍了一些常用函数。本篇开始将早期OpenGL的一些语法。
仍然从测试代码开始
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glVertex2f(-0.5, -0.5);
glVertex2f(-0.5, 0.5);
glVertex2f(0.5, 0.5);
glVertex2f(0.5, -0.5);
glEnd();
glFlush();
}
这是测试代码的渲染图形回调函数,我们能看到显示的图形就是由这个函数刻画的。
将缓冲清除到预设的值
这几乎是所有OpenGL制图的第一步,因为你画图时总希望窗口是干净的。除非你每次都想在上一次重显后继续进行,然而这并不常见。调用void glClear(GLbitfield mask)
函数可以清除缓冲,这个函数传一个标识位来控制应该清除哪一种缓冲。目前有三种可选的标识位GL_COLOR_BUFFER_BIT
、GL_DEPTH_BUFFER_BIT
和GL_STENCIL_BUFFER_BIT
,我们只用到清除颜色缓冲到预设值,也就是说每次重显都要将窗口变成预设颜色。
那么怎么确定预设值呢?OpenGL提供了一系列的函数来刻画预设值void glClearColor(GLfloat red,GLfloat green,GLfloat blue,GLfloat alpha)
、void glClearDepth(GLdouble depth)
和void glClearStencil(GLint s)
分别对应上述的缓冲。拿颜色缓冲举例,我们在传入的参数中确定了颜色信息(RGBA)就可以将每次重显的颜色确定好。
界定渲染顶点
早期的OpenGL通过void glBegin(GLenum mode)
和void glEnd(void)
一对函数来确定一个或一组图元(primitive)的顶点。所有的图元顶点声明都放在这一对函数之间,图元的类型由void glBegin(GLenum mode)
函数的参数传入。这个参数是一个枚举类型,可以是GL_POINTS
、GL_LINES
、GL_LINE_STRIP
、GL_LINE_LOOP
、GL_TRIANGLES
、GL_TRIANGLE_STRIP
、GL_TRIANGLE_FAN
、GL_QUADS
、GL_QUAD_STRIP
和GL_POLYGON
中的任意类型。
但是这一对函数在现代OpenGL中已经移除了,所以在现代OpenGL调用这一对函数虽然不会报错,但是毫无效果。
刻画顶点
这是给出的OpenGL的函数公式,绝大多数OpenGL的函数都是这样定义的。所以对照这个公式,我们就可以理解测试代码中利用glVertex2f(-0.5, -0.5)
等函数定义了一系列点坐标。需要注意的是OpenGL的坐标范围都是从-1.0f到+1.0f,颜色范围也是如此。
有了点集和渲染图元类型就可以画出一个图形了。
完成绘图操作
由于OpenGL可能在网络上或加速器上渲染的,所以在用户对图形操作(例如点击)之前应当清空所有缓冲。所以我们需要void glFlush(void)
函数强制执行所有OpenGL操作。
还有一个函数void glFinish(void)
也是用来完成绘图工作的。它和前者不同在于它不能随时返回,它的工作原理是阻塞程序直到所有的绘图操作执行完。
在以后文章中我会介绍更多的图元绘制、绘制属性(包括反走样)、法线向量和顶点数组等。虽然不常用,但是对理解现代OpenGL还是很有用处的。