OpenGL 显示列表是一组预先存储并编译过的的 opengl 命令,它可以在任何地方被调用并按顺序立即执行。
说说几个相关的函数:
1,显示列表的创建:
void glNewList(GLuint list , GLenum mode);
第一个参数为自己指定的显示列表的序号,调用时要用到,如果序号指定重复则后面的显示列表将覆盖前面的
第二个参数表示显示列表被处理的方式,有 编译 和 便宜且执行 两种,分别对应常量 GL_COMPILE 和
GL_COMPILE_AND_EXECUTE
void glEndList();
你所要进行的操作则定义在上面两个函数之间,如下(不过没什么实用):
glNewList(1 , GL_COMPILE);
glBegin(GL_LINES);
glVertex2f(-0.5f , -0.5f);
glVertex2f(0.5f , 0.5f);
glEnd();
glEndList();
2,单个显示列表的执行:
glCallList(GLuint list);
参数即为定义显示列表时所指定的序号,如:glCallList(1);
3,显示列表的管理:
GLuint glGenLists(GLsizei range);
如前说过的,因为显示列表是由其序号来识别的,如果定义了一个相同序号的显示列表,则后定义的显示列表会代替已存在的显示列表,这当然不是我们想要的。为了避免这一点,可以用上面这个函数来创建一个或多个没有用过的显示列表。
该函数创建 range 个连续且未被占用的显示列表的序号,返回一个整数,该整数就是这 range 个连续显示列表序号中的最小序号。如若返回的是 n , 则创建的显示列表序号为 n , n+1 , ……, n + range -1 。
GLint index = glGenLists(1);
glNewList(index , GL_COMPILE);
// 其他代码
glEndList();
GLboolean glIsList(GLuint list);
该函数用来查询指定序号的显示列表是否已经被占用
void glDeleteLists(GLuint list , GLsizei range);
显示列表既然能被创建那么一定也能被删除,上面的函数用来删除序号从 list 起的连续 range 个显示列表
4,多个显示列表的执行:
void glListBase(GLuint base);
该函数用来指定将要执行的多个显示列表的序号基数,将与下面说的函数的相关参数进行配合。参数 base 可以为任何整数,初始为 0
void glCallLists(GLsizei n , GLenum type , const GLvoid * lists);
该函数执行一个显示列表序列。其中,参数 n 表示将要执行的显示列表的个数;参数 type 表示 第三个参数 lists 的类型,如: GL_BYTE , GL_UNSIGNED_INT 等等;第三个参数 lists 是一个数组地址,记录一系列的偏移量,前一个函数指定的显示列表基数加上偏移量就是将要执行的显示列表的序号。如下:
GLint index = glGenLists(4);
glListBase(index);
glNewList(index , GL_COMPILE);
// 其他代码
glEndList();
glNewList(index + 1 , GL_COMPILE);
// 其他代码
glEndList();
glNewList(index + 2, GL_COMPILE);
// 其他代码
glEndList();
glNewList(index + 3, GL_COMPILE);
// 其他代码
glEndList();
GLbyte bArray[4] = {0 , 1 , 2 , 3};
glCallLists(4 , GL_BYTE , bArray);