0

我无法清楚地理解显示列表。例如,如果我想绘制一个具有复杂光线的场景,并且可能会更改场景中对象使用的材质。设置素材的速度可能比较慢,所以我可以把素材的定义放在显示列表中。那么使用 displaylist 有什么好处呢?

4

1 回答 1

4

显示列表本质上是宏记录器/播放器。编译显示列表时,OpenGL 实现将发送给它的所有命令记录到一个对象中。不幸的是,显示列表使用起来有点麻烦。例如,显示列表存储传递给纹理对象的数据(它们曾经在 OpenGL-1.0 中用作纹理存储,大约 1992 年,在引入纹理对象之前),但它们不会存储通过顶点数组绘制的几何数据.

通过显示列表获得的任何性能提升都是由于(GPU 端)顶点数组允许批量处理大量即时模式调用的可能性。随着顶点缓冲区对象的可用,显示列表的这种使用变得过时了。这大约是 2000 年左右。显示列表的唯一剩余用途是封装 OpenGL 状态设置,这很有用,因为为固定功能管道设置状态记录非常繁琐。自从 OpenGL 完全基于着色器以来,许多固定功能状态也变得过时了。今天,您通过调用大量 OpneGL 状态调用(或一个 glCallLists)所做的工作已被简单地为手头的任务选择正确的着色器程序所取代。

自从显示列表完全过时并且没有提供可行的性能增益以来。

同样值得注意的是,OpenGL 侧矩阵数学运算(glLoadIdentity、glTranslate、glRotate 等)不是由 GPU 执行的。矩阵由驱动程序准备好,然后上传到 GPU。显示列表只存储准备好的矩阵并上传它。但是从带宽和性能的角度来看,自己调用 glUniform / glLoadMatrix 或让显示列表触发该代码路径没有区别。因此,Khronos 做了合理的事情,并从任何现代 OpenGL 版本和变体中删除了显示列表。

TL;DR:当顶点缓冲区对象无法将几何图形放入快速内存并将更大的 OpenGL 状态集编译成一个名称时,显示列表曾经是一个有用的工具。现代 OpenGL 显示列表不再提供优势,只会增加驱动程序的大小和复杂性,因此显示列表已从现代 OpenGL 变体中删除。

于 2012-11-29T11:06:01.460 回答