为什么opengl 3.1中不推荐使用显示列表?

为什么opengl 3.1中不推荐使用显示列表?,opengl,Opengl,我只是在了解它们,发现它们被弃用令人沮丧。我应该继续投资学习它们吗?我能学到一些对当前模型有用的东西吗 我认为,尽管我可能错了,但由于大多数高性能图形应用程序(主要是游戏)几乎只使用顶点缓冲区等(为了压缩卡上的每一点性能),因此有压力停止担心诸如显示列表之类的“琐碎”项目(甚至好的旧glVertex调用)。我的意思是,这给人们学习编写OpenGL代码带来了巨大的障碍,而且(出于我自己的目的)对于快速、易读、性能相当好的代码来说是一个巨大的障碍 请注意,这些功能在3.0中已被弃用,并在3.1中实际

我只是在了解它们,发现它们被弃用令人沮丧。我应该继续投资学习它们吗?我能学到一些对当前模型有用的东西吗

我认为,尽管我可能错了,但由于大多数高性能图形应用程序(主要是游戏)几乎只使用顶点缓冲区等(为了压缩卡上的每一点性能),因此有压力停止担心诸如显示列表之类的“琐碎”项目(甚至好的旧glVertex调用)。我的意思是,这给人们学习编写OpenGL代码带来了巨大的障碍,而且(出于我自己的目的)对于快速、易读、性能相当好的代码来说是一个巨大的障碍

请注意,这些功能在3.0中已被弃用,并在3.1中实际删除(但仍通过ARB扩展提供兼容性)。在OpenGL 3.2中,他们将这些功能移动到“兼容性”配置文件中,该配置文件是驱动程序编写者可以实现的可选配置文件

那么这意味着什么呢?NVidia,至少,已经发誓在可预见的未来继续支持老式的兼容模式——他们需要支持大量的遗留代码。您可以在以下幻灯片中找到有关他们支持的讨论:

从大约幻灯片#32开始。我不知道ATI/AMD在这个问题上的立场,但我认为这是相似的

因此,虽然显示列表在技术上已从OpenGL 3.2标准的必需部分中删除,但我认为在相当长一段时间内使用它们是安全的。最后,您可能希望学习OpenGL的以缓冲区/着色器为中心的界面,特别是如果您的最终目标是编写封套推动游戏,但它确实没有那么直观(甚至没有glRotate!),因此我建议从优秀的旧OpenGL 2.x开始


-matt

因为VBO(顶点缓冲区对象)效率更高,可以完成显示列表所能完成的一切。它们其实也不复杂,只是有点不同。除非你已经更熟悉老式的glBegin/glEnd,否则你最好从一开始就学习缓冲区。

虽然Matthew Hall有一个很好的答案,涵盖了大部分内容,但我要补充几点

如果你看看那些被弃用的东西,你会发现它有很多客户端和固定功能。所以很明显,他们正试图让人们远离以客户端为中心的代码,而让人们在GPU上尽一切可能在服务器端工作

当涉及到使用哪种上下文时,这取决于您。虽然如果性能是一个主要问题,那么3.x可能是一条出路。我个人肯定想学习OpenGL3.x,但我怀疑我会放弃1.x/2.x。在1.x或2.x环境下,将一个快速应用程序与可用的应用程序组合在一起就容易多了


如果您想要已弃用内容的列表,请下载并查看“弃用模型”下的显示列表,因为使用opengl 3+时,所有顶点、纹理和照明数据都存储在图形卡上,称为保留模式渲染(保留数据,允许您向卡发送单个命令以绘制网格,而不是每帧向卡发送顶点数据)。计算机图形学的一个主要瓶颈是RAM和gpuRAM之间的数据带宽。通过一次生成网格并保留该数据,我们可以使用齐次变换矩阵对其进行变换,并轻松绘制。这有效地减少了瓶颈,但缺点是加载时间较长。 然而,即时模式(3.0之前)使用大量的图形带宽来发送每帧顶点数据,预转换,重新计算法线等。 这种方法有两个问题: 1) 带宽使用过多,gpu空闲时间过多。 2) 在gpu上的100多个内核上并行计算时,cpu时间的过度使用

解决这个问题的简单方法是保留模式

在保留模式下,不再需要显示列表。因此,将其从岩芯剖面中移除

即时模式对于学习计算机图形学理论仍然是非常好的。(这是一件非常有趣的事情)它只是在最大可能的性能方面受到了影响

VBO和VAO起初可能不那么直观,但就速度而言,它要优越得多


internet上有几个易于理解的opengl 3.0教程。一旦你有OpenGL 2下来,你应该考虑移动到3 +,因为它允许你建立非常快速的3D图形应用程序。p> 未来的注意事项:最新的Direct-X、Metal和Vulkan API具有命令缓冲区和命令队列,允许在CPU中记录命令,然后将它们发送到GPU在那里执行。因此,显示列表可能不是一个如此过时的想法。事实上,编译显示列表与着色器和VBO的使用是正交的,显示列表可以进一步提高性能……我想知道Vulkan或Metal-to-OpenGL转换器是否可以将显示列表用于命令缓冲区……

在“不推荐”和“删除”之间有区别。仅供参考。不推荐使用的内容通常不会立即删除。@它们仅从核心中删除,但在兼容模式下可用。所以它们并没有被完全删除。@Calmarius这正是不推荐在GL中的意思。在AMD GL3白皮书()中找到以下内容:“AMD目前没有计划从不向前兼容的OpenGL上下文中删除任何这些已弃用和已删除的项目。AMD计划支持目前在许多代码库中广泛使用的功能和接口。”“这为人们学习编写OpenGL代码提供了巨大的障碍,并且(出于我自己的目的)是快速生成一些快速、易读且性能相当好的代码的一大障碍-OpenGL应该被视为一个低级图形API,因此用“内存缓冲区obje”来形容