hyde
路人甲
路人甲
  • 注册日期2003-09-24
  • 发帖数555
  • QQ
  • 铜币1457枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1262回复:0

OpenGL系列讲座(25)

楼主#
更多 发布于:2004-03-21 11:10
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);要编辑顶点,

只需重新建立相应的该顶点显示列表。

喜欢0 评分0
夜落了,风静了,我喜欢一本书,一杯茶,一粒摇曳的烛光...
游客

返回顶部