【问题标题】:Can I glDeleteBuffer a VBO and IBO after binding to a VAO?绑定到 VAO 后,我可以 glDeleteBuffer 一个 VBO 和 IBO 吗?
【发布时间】:2021-11-04 09:17:21
【问题描述】:

我读过 VBO(顶点缓冲区对象)本质上保留了一个引用计数,因此如果将 VBO 的名称指定给 glDeleteBuffers(),那么如果一个活着的 VAO(顶点数组对象)仍然存在,它就不会真正被解散引用它。这种行为类似于“智能指针”,较新的语言越来越多地采用。但是这在多大程度上是正确的并且可以围绕它进行设计,如果它也适用于 IBO(索引缓冲区对象),我还没有找到任何相关信息。

如果 VBO 由引用它的 VAO 保持活动状态,并且我不打算更新它或在 VAO 死亡后使用它,我认为最好的办法是销毁我对它的引用。这样做合适吗?我可以对 IBO 做同样的事情吗?

【问题讨论】:

  • 出于好奇,您是在哪里读到的?我在 Khronos 网站上进行了简短搜索,但没有找到任何东西。这很可能是真的,但它可能是一个内部设计选择,随时可能发生变化,不应依赖。
  • @Yun - 我只是假设它在内部使用引用计数;我了解到 VAO 只能通过阅读几个月前某个地方的一个非常简短的提及来保持 VBO 的活力。我也找不到太多关于它的信息。

标签: c++ opengl vertex-buffer vertex-array-object index-buffer


【解决方案1】:

对象可以附加到其他对象。只要一个对象附加到另一个对象,附加的对象实际上不会通过调用glDelete* 被销毁。只有在它未附加或它所附加的对象也被销毁后才会被销毁。

这并不是真正需要担心的事情。如果您glDelete* 一个对象,则不应再次直接使用该名称。

【讨论】:

  • 谢谢!一个 VAO 可以连接 1 个 IBO 和 16 个 VBO,所以我认为 IBO 也可以保持活动状态。 (当然,如果我弄错了,请纠正我)
  • 我相信你,但你碰巧有这种行为的参考吗? :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 2017-09-23
  • 1970-01-01
相关资源
最近更新 更多