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。
分享到:
相关推荐
计算机图形学 实验4 显示列表 OpenGL display list
使用opengl的显示列表,实现3d物体的创建,减少3d渲染,加快程序运行速度。
立体的创建OpenGL显示列表与颜色的应用
OpenGL显示列表与颜色的应用,面和体的创建
OpenGL显示列表.pdf
OpenGL 显示列表加速图形绘制的功能实现。运行时可显示帧频。
介绍了OpenGL基础图形编程的列表显示功能,以VC++为平台介绍。
在即时模式(Immediate Mode)下绘图,OpenGL函数被直接送进绘图流水线,相应的 图形对象被立即绘制出来。当需要在程序中多次绘制同一个复杂的图形时,这种绘制方 式会耗费大量的资源,从而降低程序的...式---显示列表。
OpenGL使用Window API绘制矢量字体(非常简单)
此程序为我做课程设计时OpenGL多级显示列表代码,供初学者参考
第十六章 OpenGL显示列表 16.1 显示列表概论 16.1.1 显示列表的优势 16.1.2 显示列表的适用场合 16.2 创建和执行显示列表 16.2.1 创建显示列表 16.2.2 执行显示列表 16.3 管理显示列表 16.4 多级...
第十六章 OpenGL显示列表 16.1 显示列表概论 16.1.1 显示列表的优势 16.1.2 显示列表的适用场合 16.2 创建和执行显示列表 16.2.1 创建显示列表 16.2.2 执行显示列表 16.3 管理显示列表 16.4 多级...
15.2.3 多边形的反走样 15.3 雾 15.3.1 雾的概论和例程 15.3.2 雾化步骤 第十六章 OpenGL显示列表 16.1 显示列表概论 16.1.1 显示列表的优势 16.1.2 显示列表的适用场合 16.2 创建和执行显示列表 16.2.1 ...
OpenGL入门学习之八——使用显示列表.pdf
桌子上放两层兔子,每层9个,铺满整个桌面 键盘控制:1控制是否用显示列表绘制,并比较两种...增加键盘按键来切换显示列表和非显示列表绘制方式,通过动画以及对FPS的理解和分析,理解显示列表对程序绘制性能的影响。
体建模、特殊光和特殊效果处理以及OpenGL显示列表、帧缓存与动画的程序设计技巧。 书中列举了大量的编程实例,并且全部存于本书附盘中。所有例程都经过调试通过,是 OpenGL开发者必备之参考。 本书无论是对初次...
为了优化性能,OpenGL显示列表更像是个命令缓存器,而不是个动态数据库。换句话说, 当显示列表被创建之后,它就无法进行更改。如果显示列表允许进行更改,那么由于搜索显示 列表并执行内存管理所带来的开销将会降低...