本文共 1501 字,大约阅读时间需要 5 分钟。
OpenGL显示列表是一种通过预先存储并缓存OpenGL函数调用命令的方式绘制图形的技术。与立即模式相比,显示列表能够显著提升绘图性能,尤其是在复杂场景下。
显示列表的核心优势在于其高效的命令缓存机制:
适合显示列表的场景包括:
OpenGL 提供 glNewList()
和 glEndList()
函数来创建显示列表:
void glNewList(GLuint list, GLenum mode);
:开始创建一个新显示列表,mode
参数可选 GL_COMPILE
(仅存储)或 GL_COMPILE_AND_EXECUTE
(存储并立即执行)。void glEndList();
:标记显示列表的结束。注意:某些函数如 glDeleteLists()
、glFeedbackBuffer()
等不能直接存入显示列表。
调用显示列表的函数:
void glCallList(GLuint list);
:执行已创建的显示列表。例子:以下代码创建并执行一个包含三角形绘制的显示列表,并在主循环中重复调用。
void myinit() { glNewList(listName, GL_COMPILE); glColor3f(1.0, 0.0, 0.0); glBegin(GL_TRIANGLES); glVertex2f(0.0, 0.0); glVertex2f(1.0, 0.0); glVertex2f(0.0, 1.0); glEnd(); glTranslatef(1.5, 0.0, 0.0); glEndList(); glShadeModel(GL_FLAT);}
GLuint glGenList(GLsizei range);
:分配 range
个新的显示列表索引。GLboolean glIsList(GLuint list);
:检查显示列表索引是否已被占用。void glDeleteLists(GLuint list, GLsizei range);
:删除指定范围内的显示列表。显示列表支持多级嵌套,允许在一个显示列表中调用另一个显示列表。这种机制特别适合复杂的物体构建:
glNewList(1, GL_COMPILE);glVertex3fv(v1);glEndList();glNewList(2, GL_COMPILE);glVertex3fv(v2);glEndList();glNewList(3, GL_COMPILE);glVertex3fv(v3);glEndList();glNewList(4, GL_COMPILE);glBegin(GL_POLYGON);glCallList(1);glCallList(2);glCallList(3);glEnd();glEndList();
通过这种方式,顶点数据可以被单独管理,而整个三角形可以通过调用显示列表4来绘制。
转载地址:http://srwp.baihongyu.com/