阅读:1362回复:0
OpenGL系列讲座(25)
6.3 管理显示列表
在上一节例子中,我们使用了一个正整数作为显示列表的索引。但是在实际应用中,一 般不采用这种方式,尤其在创建多个显示列表的情况下。如果这样做,则有可能选用某个正 在被占用的索引,并且覆盖这个已经存在的显示列表,对程序运行造成危害。为了避免意外 删除,可以调用函数glGenList()来产生一个没有用过的显示列表,或调用glIsList()来决 定是否指定的显示列表被占用。此外,在管理显示列表的过程中,还可调用函数glDeleteLists() 来删除一个或一个范围内的显示列表。下面分别介绍这些函数: GLuint glGenList(GLsizei range); 分配range个相邻的未被占用的显示列表索引。这个函数返回的是一个正整数索引值, 它是一组连续空索引的第一个值。返回的索引都标志为空且已被占用,以后再调用这个函数 时不再返回这些索引。若申请索引的指定数目不能满足或range为0则函数返回0。 GLboolean glIsList(GLuint list); 询问显示列表是否已被占用的情况。若索引list已被占用,则函数返回TURE;反之, 返回FAULSE。 void glDeleteLists(GLuint list,GLsizei range); 删除一组连续的显示列表,即从参数list所指示的显示列表开始,删除range个显示列 表,并且删除后的这些索引重新有效。若删除一个没有建立的显示列表则忽略删除操作。 当建立一个与已经存在的显示列表索引相同的显示列表时,OpenGL将自动删除旧表。 这一节举个例子来说,如果将上一节程序/*** .c*/中所创建的显示列表改为以下代码: listIndex=glGenLists(1); if(listIndex!=0) { glNewList(listIndex,GL_COMPILE); ... glEndList(); } 那么,这个程序将更加优化实用。读者自己不妨试试,同时还可用它多创建几个显示列 表,或者再删除一个,看看效果怎样? 6.4 多级显示列表 多级显示列表的建立就是在一个显示列表中调用另一个显示列表,也就是说,在函数 glNewList()与glEndList()之间调用glCallList()。多级显示列表对于构造由多个元件组成 的物体十分有用,尤其是某些元件需要重复使用的情况。但为了避免无穷递归,显示列表的 嵌套深度最大为64(也许更高些,这依赖于不同的OpenGL实现),当然也可调用函数 glGetIntegerv()来获得这个最大嵌套深度值。 OpenGL在建立的显示列表中允许调用尚未建立的表,当第一个显示列表调用第二个并没 定义的表时,不会发生任何操作。另外,也允许用一个显示列表包含几个低级的显示列表来 模拟建立一个可编辑的显示列表。如下一段代码: glNewList(1,GL_COMPILE); glVertex3fv(v1); glEndList(); glNewList(2,GL_COMPILE); glVertex3fv(v2); glEndList(); glNewList(3,GL_COMPILE); glVertex3fv(v3); glEndList(); glNewList(4,GL_COMPILE); glBegin(GL_POLYGON); glCallList(1); glCallList(2); glCallList(3); glEnd(); glEndList(); 这样,要绘制三角形就可以调用显示列表4了,即调用glCallList(4);要编辑顶点, 只需重新建立相应的该顶点显示列表。 |
|
|