OpenGL系列教程之二:OpenGL概述





OpenGL是一种图形硬件的软件接口。它被设计成一种可以运行在多种不同硬件平台上与硬件无关的接口。OpenGl程序也可以跨过网络工作(客户-服务器的形式),即使客户机和服务器是不同的机器类型。OpenGL中的客户机是OpenGL程序真正执行的机器,而服务器是实现渲染的机器。

OpenGL在OpenGL核心的命令前使用了前缀gl,在OpenGL工具类中的命令前使用了前缀glu。相似地,OpenGl常量都是以GL_开始的并且全部都是大写字母。OpenGL也使用后缀来指定函数的函数数目和类型。

glColor3f(1, 0, 0);         // 使用3个浮点型的数字设置渲染颜色为红色
glColor4d(0, 1, 0, 0.2);    // 使用双精度浮点型设置渲染颜色为绿色,不透明度为20%
glVertex3fv(vertex);        // 使用向量设置x,y,z的坐标


OpenGL是一个状态机。属性和模式将保持作用效果直到它们被改变为止。大多数状态变量能使用glEnable()函数和glDisable()函数来启用和禁用。你也可以使用glIsEnabled()函数来检查一个状态现在是否被启用。你能使用glPushAttrib()函数和glPopAttrib()函数来将很多状态变量保存在一个存放属性变量的栈中或从这个栈中恢复出来。GL_ALL_ATTRIB_BITS参数能被用来保存或恢复所有的状态。栈的数目在标准OpenGL中至少有16个(使用glinfo函数检查栈最多能容纳的元素个数)。

glPushAttrib(GL_LIGHTING_BIT);    // 改变状态的最佳方式,这样后面你能使用glPopAttrib()函数恢复到现在的状
    glDisable(GL_LIGHTING);       //态,第一行代码将GL_LIGHTING_BIT状态入栈,这样接下来可以对这个状态进行
    glEnable(GL_COLOR_MATERIAL);  // 修改,并且某一时刻可以恢复到入栈时的状态
    glPushAttrib(GL_COLOR_BUFFER_BIT);
    glDisable(GL_DITHER);
    glEnable(GL_BLEND);

... // do something

glPopAttrib();                    // 第一次调用将恢复最后入栈时的状态,即GL_COLOR_BUFFER_BIT
glPopAttrib();                    // 第二次调用将恢复倒数第二次调用时的状态,即GL_LIGHTING_BIT


为了在OpenGL中绘制几何图元(点,线,三角形等),你可以在glBegin()和glEnd()函数之间指定一系列顶点数据。这种方法叫做立即模式。(你也可以使用其他方法绘制几何图元,如顶点数组

glBegin(GL_TRIANGLES);
    glColor3f(1, 0, 0);     // 设置顶点的颜色为红色
    glVertex3fv(v1);        // 使用v1,v2,v3这3个顶点绘制三角形
    glVertex3fv(v2);
    glVertex3fv(v3);
glEnd();

OpenGL中有10种图元类型: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命令都可以放置在glBegin()和glEnd()之间的。只有一部分命令可以放置在这两个函数之间,如glVertex*(),glColor*(),glNormal*(),glTexCoord*(),glMaterial*(),glCallList()等。




和计算机中的IO缓冲区比较类似,OpenGL命令并不是立即执行的。所有的命令首先被存储在缓冲区中,包括网络中的缓冲区和图形加速器自身,直到缓冲区满了才开始执行。例如,如果一个应用程序需要通过网络来执行,那么一次发送一系列的命令显然比一次只发生一个命令更加高效。

glFlush()清空这个缓冲区中的所有命令并且强迫这个命令立即执行而不需要等待缓冲区塞满。因此glFlush保证了所有OpenGL命令在调用glFlush()之后在有限的时间内会被全部执行。并且glFlush函数不会等待之间的命令执行完且有可能立即返回到你的程序中。因此,你可以很自由地发送更多的命令即使之间的命令没有被执行完。

glFinish()像glFlush函数一样刷新缓冲区并强迫命令开始执行。但是glFlush函数块会阻塞其他的OpenGL命令直到glFlush函数块中的所有命令被执行完。因此,glFlush()函数直到所有的OpenGL命令都被执行完了才会返回到你的程序中。它可能被用来同步任务或者测量某个OpenGL命令的准确的执行时间。






阅读更多

没有更多推荐了,返回首页