博客
关于我
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/

你可能感兴趣的文章
Processes
查看>>
Processing通过编程实现艺术设计_实现艺术和现实的交互---数据设计分析002
查看>>
ProcessOnLoading
查看>>
SpringBoot中集成screw(螺丝钉)实现数据库表结构文档生成
查看>>
PROFINET 模拟器使用教程
查看>>
Program type already present: android.support.v4.widget.EdgeEffectCompat
查看>>
PyTorch中文版官方教程来啦(附下载)
查看>>
Progress Kemp LoadMaster 远程命令执行漏洞复现(CVE-2024-1212)
查看>>
Project configuration is not up-to-date with pom.xml. Run Maven->Update Project
查看>>
Project Euler 15 Lattice paths
查看>>
Project Euler 48 Self powers( 大数求余 )
查看>>
Project Euler Problem 12: Highly divisible triangular number
查看>>
ProjectEuler 2
查看>>
projection介绍及EPSG:4326和EPSG:3857的投射转换
查看>>
project打开文件时,显示无法识别此文件格式?
查看>>
Prometheus + Grafana on Kubernetes部署
查看>>
prometheus + grafana进行服务器资源监控
查看>>
Prometheus Alertmanager 告警配置详解
查看>>
Prometheus Grafana 展示平台
查看>>
Prometheus pushgateway使用详解
查看>>