1. 显示列表如何提高性能
(1)可以定义一个几何图形,在以后多次执行它。
(2)当通过网络在另一台远程机器上运行OpenGL程序时,显示列表存放在服务器上,于是可以大大减少网络的数据传输量。
2. 显示列表在以下领域可以体现优化作用
(1)矩阵操作
如一个glRotate函数,可能会有相当大得性能提升,因为产生旋转矩阵的计算是比较复杂的
(2)对位图和图像进行光栅化
程序所指定的光栅化数据的格式并不一定最合适硬件,在编译显示列表时,OpenGL可能会把数据转换为最适合硬件的形式。
(3)光源、材料属性和光照模型
3. 创建和执行显示列表
GLuint listName;
listName = glGenLists(1);
glNewList(listName, GL_COMPILE);
...
glEndList();
glCallList(listName);
4. 显示列表的管理
(1)GLuint glGenList(GLsizei range)
分配range个相邻的未被占用的显示列表索引。这个函数返回的是一个正整数索引值,它是一组连续空索引的第一个值。返回的索引都标志为空且已被占用,以后再调用这个函数时不再返回这些索引。若申请索引的指定数目不能满足或range为0则函数返回0。
(2)GLboolean glIsList(GLuint list);
询问显示列表是否已被占用的情况。若索引list已被占用,则函数返回TURE;反之,返回FAULSE。
(3)glDeleteLists(GLuint list,GLsizei range);
删除从list开始的range个显示列表
5.层次式显示列表
glNewList(listIndex, GL_COMPILE);
glCallList(list1);
glCallList(list2);
glEndList();
6. 用显示列表管理状态变量
glNewList(listIndex, GL_COMPILE);
glPushMatrix();
glPushAttrib(GL_CURRENT_BIT);
...
glPopAttrib();
glPopMatrix();
封闭模式修改:
GLuint offset;
offset = glGenLists(3);
glNewList( offset, GL_COMPILE);
glDisable(GL_LINE_STIPPLE);
glEndList();
glNewList( offset+1, GL_COMPILE);
glEnable(GL_LINE_STIPPLE);
glEndList();
glCallList(offset);
drawLine();
glCallList(offset+1);
drawLine();