博客
关于我
OpenGL显示列表
阅读量:222 次
发布时间:2019-02-28

本文共 1501 字,大约阅读时间需要 5 分钟。

OpenGL显示列表

显示列表概述

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/

你可能感兴趣的文章
Python--Redis实战:第四章:数据安全与性能保障:第4节:复制
查看>>
python--基本代码规范
查看>>
Python--抽象类接口类
查看>>
PYTHON--欧拉习题二
查看>>
python--高级应用总结
查看>>
python-520表白代码,我看谁说程序员不懂浪漫,送你几套表白代码,一步到位
查看>>
Python-Asyncio TypeError:无法在‘;等待‘;表达式中使用对象DICT
查看>>
Python-AttributeError:‘;dict&39;对象没有属性‘;序列‘;
查看>>
Python-ldap:是否可以在不显式写入密码的情况下进行绑定?
查看>>
python出现 unknown encoding: idna 的处理方法
查看>>
Python出现 RuntimeError: dictionary changed size during iteration 的解决方法
查看>>
Python-numpy(2)数组的操作
查看>>
Python-Numpy的tile函数用法
查看>>
python-open函数
查看>>
Python-Pandas-将特定函数应用于给定级别-多索引数据框架
查看>>
python-queue队列通信
查看>>
python-ros No module named PyKDL
查看>>
python-social-auth 是否需要会话
查看>>
Python再获年度编程语言,微软或成最大赢家
查看>>
python-week5
查看>>