1、为什么要用显示列表
对于复杂的图形,有成千上万个顶点,每次刷新屏幕都于重新计算顶点,让CPU执行重复的工作,浪费了CPU资源和运行速度的下降。如果把计算好的结果存放到显示列表中,需要刷新屏幕时,只需要把数据刷新到显卡里就可以了,节省CPU计算资源。
2、分配显示列表编号
GLuint glGenLists (GLsizei range);
GLsizei range:指定要分配几个显示列表。
返回的是分配的若干连续编号中最小的一个(即起始号)。
GLuint minNum2= glGenLists (2); // 分配2个显示列表
GLuint minNum3 = glGenLists (3); // 分配3个显示列表
3、创建显示列表
void glNewList (GLuint list, GLenum mode);
GLuint list:当前正在操作的显示列表号。
GLenum mode:GL COMPILE和GL COMPILE AND EXECUTE,
GL COMPILE声明当前显示列表只是装入相应OpenGL语句,不执行;
GL COMPILE AND EXECUTE表示在装入的同时,执行一遍当前显示列表。
glNewList(list, GL_COMPILE);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex2f(0.0f, 0.0f);
glEnd();
4、调用显示列表
void glCallLists (GLsizei n, GLenum type, const GLvoid *lists);// 调用一组
void glCallList (GLuint list);// 调用一个
GLsizei n:表示显示列表的个数
GLenum type,:表示lists的类型,GL_BYTE,GL_UNSIGNED_BYTE,GL_SHORT,GL_UNSIGNED_SHORT,GL_INT,GL_UNSIGNED_INT,GL_FLOAT。
const GLvoid *lists:显示列表数组
GLuint lists[] = {1, 3, 4, 8};
// 起始值为10
glListBase(10);
// 则实际上调用的是编号为11, 13, 14, 18的四个显示列表。
glCallLists(4, GL_UNSIGNED_INT, lists);
5、销毁显示列表
void glDeleteLists (GLuint list, GLsizei range);
GLuint list:指定起始号
GLsizei range:指定要分配几个显示列表。
6、例程下载
运行效果:
下载例程