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毫秒