`
huozheleisi
  • 浏览: 1236343 次
文章分类
社区版块
存档分类
最新评论

OpenGL显示列表

 
阅读更多

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。 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics