OpenGL显示列表

来源:互联网 发布:access导入sql文件 编辑:程序博客网 时间:2024/04/28 13:59

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。