零基础入门OpenGL系列教程(四、早期OpenGL基础)

上一篇大概介绍了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_BITGL_DEPTH_BUFFER_BITGL_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_POINTSGL_LINESGL_LINE_STRIPGL_LINE_LOOPGL_TRIANGLESGL_TRIANGLE_STRIPGL_TRIANGLE_FANGL_QUADSGL_QUAD_STRIPGL_POLYGON中的任意类型。

但是这一对函数在现代OpenGL中已经移除了,所以在现代OpenGL调用这一对函数虽然不会报错,但是毫无效果。

刻画顶点

零基础入门OpenGL系列教程(四、早期OpenGL基础)_第1张图片
OpenGL函数

这是给出的OpenGL的函数公式,绝大多数OpenGL的函数都是这样定义的。所以对照这个公式,我们就可以理解测试代码中利用glVertex2f(-0.5, -0.5)等函数定义了一系列点坐标。需要注意的是OpenGL的坐标范围都是从-1.0f到+1.0f,颜色范围也是如此。

有了点集和渲染图元类型就可以画出一个图形了。

零基础入门OpenGL系列教程(四、早期OpenGL基础)_第2张图片
运行效果

完成绘图操作

由于OpenGL可能在网络上或加速器上渲染的,所以在用户对图形操作(例如点击)之前应当清空所有缓冲。所以我们需要void glFlush(void)函数强制执行所有OpenGL操作。

还有一个函数void glFinish(void)也是用来完成绘图工作的。它和前者不同在于它不能随时返回,它的工作原理是阻塞程序直到所有的绘图操作执行完。

在以后文章中我会介绍更多的图元绘制、绘制属性(包括反走样)、法线向量和顶点数组等。虽然不常用,但是对理解现代OpenGL还是很有用处的。

你可能感兴趣的:(零基础入门OpenGL系列教程(四、早期OpenGL基础))