OpenGL简介
OpenGL是图形硬件的一种软件接口。它被设计为硬件独立的接口,可用于多种不同硬件平台。OpenGL程序也可以在网络(客户端-服务器端模式)上工作,即使客户端与服务器端为不同类别的计算机。OpenGL的客户端为OpenGL程序实际运行的计算机,服务器为执行绘图操作的计算机。
OpenGL使用gl作为OpenGL核心命令的的前缀,glu作为OpenGL通用库的前缀。类似地,OpenGL常量以GL_开头,且全部使用大小字母。OpenGL也使用后缀指定传递给OpenGL的参数数量与数据类型。
glColor3f(1, 0, 0); // 使用3个浮点数据设置显示颜色为红色 glColor4d(0, 1, 0, 0.2); // 设置颜色为带有20%不透明度的绿色(double) glVertex3fv(vertex); // 使用指针设置x-y-z坐标值
状态机
OpenGL是一个状态机。OpenGL的模式与属性都在下次更改之前一直有效。绝大部分状态变量可以通过glEnable()与glDisable()开启与关闭。你也可以使用glIsEnabled()检测一个状态当前是否被开启或关闭。通过glPushAttrib()或glPopAttrib(),你可以保存一组状态到属性栈,或从属性栈中恢复。GL_ALL_ATTRIB_BITS参数用于保存/恢复所有状态。标准OpenGL中必须至少有16个栈。(使用glinfo检测栈的最大数量。)
glPushAttrib(GL_LIGHTING_BIT); // 更改状态的简单方式 glDisable(GL_LIGHTING); // 因为在调用glPopAttrib()之后能够正好恢复上一次状态 glEnable(GL_COLOR_MATERIAL); glPushAttrib(GL_COLOR_BUFFER_BIT); glDisable(GL_DITHER); glEnable(GL_BLEND); ... // 其他 glPopAttrib(); // 恢复GL_COLOR_BUFFER_BIT glPopAttrib(); // 恢复GL_LIGHTING_BIT
glBegin()与glEnd()
为了在OpenGL中绘制几何图元(点、线、三角形等),你可以在glBegin()与glEnd()中指定定点数据列表。该方式为立即模式。(你可以使用其他方式绘制几何图元,如顶点列表。)
glBegin(GL_TRIANGLES); glColor3f(1, 0, 0); // 设置颜色为红色 glVertex3fv(v1); // 使用v1、v2、v3绘制三角形 glVertex3fv(v2); glVertex3fv(v3); glEnd();
OpenGL中有10中图元:GL_POINTS、GL_LINES、GL_LINE_STRIP、GL_LINE_LOOP、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN、GL_QUADS、GL_QUAD_STRIP与GL_POLYGON。
注意,并不是所有OpenGL命令都能够放在glBegin()与glEnd()中。仅仅能够使用这些命令的一小部分:glVertex*()、glColor*()、glNormal*()、glTexCoord*()、glMaterial*()、glCallList()等。
glFlush()与glFinish()
类似IO缓冲操作,OpenGL命令并不是立即执行的。所有命令首先存放在缓存中,包括网络缓存与显卡加速器本身,并且在缓存未满之前一直等待执行。例如,如果应用程序在网络上运行,以单个数据包形式发送命令集合比每次在网络中发送一条命令更高效。
glFlush()清空缓存中所有命令,并且强制所有挂起命令立即执行而不必等待缓存满。因此,glFlush()确保在调用glFlush()后的有限时间内执行所有调用点之前的OpenGL命令。glFlush()并不等待先前命令执行完成,且立即返回到主程序。因此,即使先前发送的命令并未执行完成,你也可以自由发送更多命令。
glFinish()与glFlush()类似,清空缓存区且强制开始执行命令。不同的是,glFinish()阻塞其他OpenGL命令,且等待所有执行结束。因此,glFinish()在先前调用的命令完成之前并不会返回到主程序中。它可用于同步任务,或用于测量特定OpenGL命令的执行时间。