Graphics 版 (精华区)

发信人: dht (bbs), 信区: Graphics
标  题: OPENGL(17)
发信站: 紫 丁 香 (Sun Oct  4 21:55:45 1998), 转信

OPENGL的显示列表

(一)简介
所谓显示列表就是一组预选存储起来的留待以后调用的函数语句。调用此显示列表
时就按次序执行其中函数。以前所有的函数调用可以称之为立即方式(Immediate
mode),现在我们将介绍显示列表方式(Display list)。

显示列表可以优化程序运行性能。它被设计成命令的高速缓存,而不是动态的数据
库缓存。一旦建立列表,删除前,则不能被修改,否则会带来系统效率的降低。
显示列表主要目的就是提高运行效率。例如任何一个几何变换的函数处于显示列表
中时,系统只保留最后的变换矩阵,这样调用时,工作量比现由函数参数生成数学
模型,再矩阵变换效率显然提高。一般来讲显示列表食用于:
一 矩阵操作 将最终变换矩阵保存以提高效率
二 光栅位图和图象 编译后的列表与高级的程序数据不同,将是匹配硬件实现的数
   据
三 光、材质和光照模型 省却复杂的模型计算
四 纹理
五 多边形的图案填充模式

注意以下函数一般不用于显示列表,作为用于传递参数或者返回数值的函数,则列
表有可能在参数作用域外被调用,因此即使列表中有这些函数,实际系统也往往按
照立即方式完成,有时甚至会出错。
glDeleteLists() glIsEnable() glFeedbackBuffer() glIsList()
glFinish() glPixelStore() glGenLists() glRenderMode() glGet*()
glSelectBuffer()

(二)实现
创建列表(格式很类似glBegin()...glEnd())

void glNewList(GLuint list,GLenum mode);
说明列表的开始,其后的函数存入列表直至结束标志(见后)。
mode:GL_COMPILE                只编译保存
      GL_COMILE_AND_EXECUTE     编译保存后,再立即执行一次

void glEndList(void)
列表结束

要调用时,只需使用
void glCallList(GLuint list);
就象调用子过程一样简单
/////////////////////////////////////////////
例如,你在某处定义:
{
GLuint listName=1;

glNewList(listName,GL_COMPILE);
 glColor3f(1.0,0.0,0.0);
 glBegin(GL_TRIANGLES);
 ...
 glEnd();
glEndList();

}
再绘制函数中调用:
{
  glCallList(listName);
}
即可。
////////////////////////////////////////////////
(三)管理显示列表
上面的例子中我们指定乐使用1显示列表,万一这个索引已经被占用乐呢?
因此需要一套管理列表的工具。

void GLuint glGenList(GLsize range);
系统生成range个相临的未被占用的可用列表空间,返回其索引
若不能正常分配空间,返回0

void GLboolean glIsList(GLuint list);
判断列表是否已经被占用

void GLDeleteLists(GLuint list,GLsizei range);
删除一组连续的显示列表,从list开始,连续删除range个。
说明:当以一个已经存在的索引创建列表时,以前的旧列表被删除。

一个安全的创建可以如下:
listIndex=glGenLists(1);
if(listIndex!=0)
{
 glNewList(listIndex,GL_COMPILE);
 ...
 glEndList();
}

(四)多级显示列表
显示列表中可以调用另一个显示列表
例如:
已经创建显示列表1 2 3
现在创建显示列表4
glNewList(4,GL_COMPILE);
 glBegin(GL_OLYGON);
   glCallList(1);
   glCallList(2);
   glCallList(3);
 glEnd();
glEndList();

由于这部分内容没有任何视觉上的新享受,所以就不给出新例子乐。
大家可以试试自己修改前面的程序,至少我没看出太大差别,xixi。

--

--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: cadcam.hit.edu.c]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.217毫秒