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

and*_*and 21 opengl

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

Gre*_*hen 25

我认为,虽然我可能错了,因为大多数高性能图形应用程序(主要是游戏)几乎只使用顶点缓冲区等(为了挤出卡中的每一滴性能),所以有压力不要担心"轻浮"的项目,如显示列表(甚至是古老的glVertex调用).恕我直言,这为学习编写OpenGL代码的人们提供了巨大的障碍,并且(出于我自己的目的)是制作一些快速,清晰,性能相当好的代码的一大障碍.

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

那么这是什么意思?至少NVidia已经发誓要继续支持老派兼容模式以实现可预见的未来 - 他们需要支持大量遗留代码.您可以在以下幻灯片中找到对其支持的讨论:

http://www.slideshare.net/Mark_Kilgard/opengl-32-and-more

从#32幻灯片开始.我不知道ATI/AMD对此的立场,但我认为它会类似.

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

-matt

  • 也就是说,在核心OpenGL 3或4中快速编写代码并不是那么难啊.将顶点添加到`std :: vector`并不比`glVertex`命令复杂,并且着色器比`glLight`和`glTextureEnv`简单得多.确实有一些样板代码需要处理,但大多数都是线性代数,最好用像GLM这样的库来解决.我说:忘记显示列表,使用核心OpenGL. (7认同)
  • *"这为人们学习编写OpenGL代码提供了巨大的障碍,并且(为了我自己的目的)是制作一些快速,清晰,性能相当好的代码的一大障碍"* - OpenGL应被视为低级别图形API,因此以"内存缓冲区对象"和"属性指针"来谈论是合适的.对于快速编写代码,像Irrlicht或Ogre或Horde3D或者Cinder这样的图形引擎可能更合适. (6认同)
  • 在AMD GL3白皮书(http://developer.amd.com/gpu_assets/GL3_WhitePaper.pdf)上找到以下内容:"AMD目前还没有计划从非向前兼容的OpenGL上下文中删除任何这些已弃用和已删除的项目. AMD计划支持目前在许多代码库中广泛使用的功能和接口." (5认同)

Ian*_*ung 6

显示列表已删除,因为在opengl 3+中,所有顶点,纹理和光照数据都存储在图形卡上,即所谓的保留模式渲染(保留了数据,允许您向该卡发送单个命令以绘制图形)。网格,而不是每帧将顶点数据发送到卡。计算机图形学的主要瓶颈是RAM和gpuRAM之间的数据带宽。通过一次生成网格并保留该数据,我们可以使用齐次变换矩阵对其进行变换,并轻松绘制它。这有效地减少了瓶颈,并且具有更长的加载时间的缺点。但是,即时模式(3.0之前的版本)使用大量图形带宽来发送每帧经预转换,具有重新计算的法线等的顶点数据。这种方法的问题有两个:1)带宽使用过多,和太多的GPU空闲时间。2)过度使用cpu时间进行计算,这可能会在gpu上的100多个内核上并行执行

一个简单的解决方案是保留模式。

使用保留模式时,不再需要显示列表。因此,将它们从核心配置文件中删除。

立即模式对于学习计算机图形学原理仍然非常有用。(启动时充满了乐趣)它只是在最大可能的性能方面受苦。

首先,VBO和VAO可能不那么直观,但是就速度而言,它要优越得多。

互联网上有一些易于理解的opengl 3.0教程。一旦关闭了openGL 2.0,就应该考虑升级到3.0+,因为它允许您构建非常快速的3d图形应用程序。