【问题标题】:Trying to understand OpenGL state and objects storage试图了解 OpenGL 状态和对象存储
【发布时间】:2015-06-18 00:42:23
【问题描述】:

我很难理解状态的确切含义。我已阅读有关顶点数组对象 (VAO) 和顶点缓冲区对象 (VBO) 以及上下文创建的信息。到目前为止,我已经了解上下文是与您创建的 OpenGL 实例相关联的所有内容的状态。

我还了解到,VAO 是对您创建的 OpenGL 分配的名称的引用,而 VBO 是这些 VAO 的数据。然而,在the OpenGL red book 中,它说当你创建一个 VBO 时,OpenGL 会为 VBO 分配一个状态,你显然必须绑定到 VAO。

我不明白的是对象和上下文之间的关系。如果上下文应该是 OpenGL 实例的状态,为什么它会创建分配给顶点缓冲区对象的附加状态?每当您调用某个更改上下文状态的函数时,它实际上会更改 VBO 而不是上下文的实际默认状态。

我是否正确理解了这一点,或者我在这里混淆了什么?

【问题讨论】:

  • 我在理解这些对象和状态之间的关系方面找到了一个定义,迄今为止最好的定义(IN PARTS):顶点数组对象(又名 VAO)是一种特殊类型的对象,它封装了所有与顶点处理器相关联的数据。它不包含实际数据,而是保存对顶点缓冲区、索引缓冲区和顶点本身的布局规范的引用。
  • 优点是一旦你为一个网格设置了 VAO,你可以通过简单地绑定 VAO 来引入整个网格状态。之后,您可以渲染网格对象,而无需担心其所有状态。 VAO 会为您记住它。如果您的应用程序需要处理顶点布局略有不同的网格,VAO 也会处理它。只需确保在创建 VAO 时设置正确的布局并忘记它。从现在开始,它会“粘”在 VAO 上,并在使用该 VAO 时激活。
  • 如果使用得当,VAO 还可以代表 GPU 驱动程序的优化机会。如果 VAO 设置一次并多次使用,则驱动程序可以利用知道索引缓冲区和顶点缓冲区之间的映射以及缓冲区中的顶点布局。显然,这取决于您使用的特定驱动程序,并且不能保证所有驱动程序的行为都相同。无论如何,请记住,最好设置一次 VAO,然后一遍又一遍地重复使用它。

标签: opengl


【解决方案1】:

OpenGL 上下文包含 OpenGL 实例中的所有状态。 VBO 和 VAO 是该“全局”状态中的子状态。它们不能存在于 GL 上下文之外(尽管您可能会与其他上下文共享它们)。当您在 VBO 或 VAO 上执行操作时,您正在修改 VBO/VAO 的状态,这是 GL 上下文的一部分,因此您也在修改它。

【讨论】:

  • 感谢您的回复,好的,我从您刚才所说的了解到,vao/vbo 中的子状态实际上不是 opnegl 上下文状态的一部分,这意味着如果您实际上什么都不添加在状态上下文中被更改但仅在顶部“分层”?这是正确的
  • @hopjoppe5 不,这根本不是答案所说的。事实上,它基本上是相反的。
  • 好的,请给我解释一下,这个被创建的状态,它是在哪里创建的?单独的内存块?相同的内存块?分层内存块?还是在客户端应用程序/内存上?
  • @hopjoppe5 这与您提出的问题不同......内存来自何处的答案取决于实现,因为规范没有规定 GL 状态的任何分配要求,除了非常模糊某些对象数据的“服务器”和“客户端”内存。但是,理论上任何 GL 命令都可以返回 GL_OUT_OF_MEMORY(尽管它们中的大多数不太可能返回)。
  • 不,我的意思是当你分配/绑定一个对象名称时,它的状态是在哪里创建的?它肯定是在openGl gpu中创建的,稍后当您再次将数据缓冲到gpu时,它是否会被写入与这些顶点相关的一些默认上下文?因为我一直在阅读abotu默认状态和应该是默认上下文的帧缓冲区状态
猜你喜欢
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-21
  • 1970-01-01
  • 2014-06-12
相关资源
最近更新 更多