在上一篇中,我们接触到了两个新知识点。下面为大家一一解惑。
第一个知识点是OpenGL显示窗口重定形函数glutReshapeFunc(winReshapeFcn)。
该函数在显示窗口尺寸输入后立即激活,对显示窗口尺寸的改变做出反应。winReshapeFcn函数的变量是接受新窗口宽度和高度的过程名,新窗口宽度和高度在窗口尺寸改变的过程中自动获取。
第二个知识点是OpenGL显示表。
OpenGL显示表(display list)是一种面向对象的思想,把对象描述成一个命令的语句序列(或任何其他的命令集),并可以用不同的显示操作多次引用该表,方便存储和调度。
使用glNewList/glEndList函数对来包围一组OpenGL命令就可形成显示表。例如,
glNewList(listID,listMode);
.
.
.
glEndList();
其中正整数类型的listID作为表名。listMode赋予OpenGL符号常量GL_COMPILE或GL_COMPILE_AND_EXECUTE之一,如果需要命令立即执行,使用GL_COMPILE_AND_EXECUTE,否则使用前一个为以后的调用而存储该表。
显示表创建后,立即对包含如坐标位置和颜色分量等参数的表示进行赋值计算,从而使表中仅仅存储参数的值。对这些参数的任何后继修改都不起作用。因为不能修改显示表的值,所以在显示表中不能包含如定点表指针等OpenGL命令。
在示例代码中有一段代码最难理解:regHex = glGenLists(1)。该句代码的作用是让OpenGL为我们生成一个标识,即将一个未使用的正整数标识赋给变量regHex。glGenLists(1)中1的含义是获得一个长度为1的标识段并将第一个赋给regHex。
那么,什么是标识呢?标识就相当于显示表的句柄,我们可以创建任意多的显示表并通过调用一个标识来执行特定的显示表。显示表标识是唯一的,当一个显示表赋予了一个已经使用的标识,则它取代原来的显示表内容。一个显示表可以嵌套在另一个显示表里。
如果有错或系统不能产生所要数量的连续整数,glGenLists函数返回0,因此使用该标识之前要先检查它是否为0。此外,还应该单独向系统查询指定整数值是否已用做显示表的名字。实现该功能的函数是glIsList(listID)。如果返回值GL_TRUE,则listID中的值已经用作某个显示表的名字,否则返回GL_FALSE。
## 其他函数 ##
1、执行一个显示表
glCallList(listID);
2、执行多个显示表
glListBase(offsetValue);
glCallLists(nLists,arrayDataType,listIDArray);
nLists表示要执行的显示表数量,listIDArray表示显示表标识的数组,arrayDataType表示listIDArray中元素的数据类型(例如GL_BYTE,GL_INT等)。显示表标识是通过将listIDArray中一个元素的值与offsetValue的整数值相加而得,offsetValue默认值为0。
3、删除连续的一组显示表
glDeleteLists(startID,nLists);
参数startID给出最前面的显示表标识,而参数nLists给出要删除的显示表总数。
这一篇文章的知识较为生硬,从下一篇开始我们将通过大量鲜活的实例进一步加深大家对图元输出的理解。