OpenGL显示列表
把对象描述成一个命名的语句序列(或任何其他的命令集)并存储起来既方便又高效。在OpenGL中使用称为显示表(display list)的结构可以做到这一点。一旦建立了显示表,就可以用不同的显示操作来多次引用该表。在网格中,描述图形的显示表存放在服务器中,以避免每次显示场景时都要传送表中的命令。我们可以为以后的执行来建立并存储显示表,或指定表中的命令立即执行。显示表对层次式建模特别有用,因为一个复杂的对象可以用一组简单的对象来描述。创建和命名OpenGL显示表
使用glNewList/glEndList函数对包围一组OpenGL命令就可形成显示表。例如:
glNewList (listID, listMode);
.
.
.
glEndList ();
该结构用赋予参数
listID的正整数作为表名来形成一个显示表。参数listMode可赋以OpenGL符号常量
GL_COMPILE或
GL_COMPILE_AND_EXECUTE之一。如果希望为以后执行而存储该表,则使用
GL_COMPILE。否则,放人表中的命令立即执行,但仍然可以在以后再执行它。
显示表创建后,立即对包含如坐标位置和颜色分量等参数的表示进行赋值计算,从而使表中仅存储参数的值。对这些参数的任何后继修改都不起作用。因为不能修改显示表的值,所以在显示表中不能包含如顶点表指针等OpenGL命令。
我们可以创建任意多的显示表并通过调用一个标识来执行特定的显示表。一个显示表还可以嵌套在另一个显示表内。但如果一个显示表被赋予一个已经使用的标识,则它取代原来的显示表内容。因此,为了避免因故重用标识而造成显示表的丢失,可以让OpenGL生成一个标识:
listID = glGenLists (1);
该语句将一个未使用的正整数标识赋给变量listID。如果将g1GenLists中的变量由1改成另外一个正整数,则得到一个未使用的显示表标识段。例如,假如引用g1GenLists (6),则保留6个连续正整数并将其中第一个赋给变量
listID。如果有错或系统不能产生所要数量的连续整数,则返回0。因此,在使用从g1GenLists子程序获得的标识之前要先检查它是否为0。
尽管使用g1GenList可生成未使用的标识,我们还是可以单独向系统查询指定整数值是否已用做表名。实现该功能的函数是
glIsList (listID);
如果返回值GL_TRUE,则listID中的值已经用做某显示表的名字。如果该整数尚未被使用,gtIsList函数则返回值
GL_FALSE。