删除缓冲区后,通过 glVertexArrayVertexBuffer 附加到 VAO 的缓冲区会发生什么?

问题描述 投票:0回答:1

我正在使用 OpenGL4.5,并尽可能使用直接状态访问。我围绕 VAO 和缓冲区对象编写了基本包装器。我正在使用

glVertexArrayVertexBuffer
将缓冲区绑定到 VAO。我想知道将绑定缓冲区的 ID/名称存储在 VAO 类中是否是个好主意。如果我在缓冲区上调用
glDeleteBuffers
,只要该缓冲区及其 ID 附加到至少一个 VAO,它就会保持活动状态吗?其内容是否会被删除,但名称/ID 仍保留并保留在 VAO 中?

opengl lifetime opengl-4 vao
1个回答
0
投票

缓冲区对象和它的名字是有区别的。

阅读 OpenGL 规范的章节 5.1 对象删除行为

简而言之:

  • 5.1.2 已删除对象自动解绑

删除缓冲区、纹理或渲染缓冲区对象时,它将与当前上下文中绑定的任何绑定点解除绑定,并与绑定到当前上下文的容器对象的任何附件分离

  • 5.1.3 已删除的对象和对象名称生命周期

当删除缓冲区、纹理、采样器、渲染缓冲区、查询或同步对象时,其名称立即变得无效(例如标记为未使用),但底层对象不会被删除,直到不再使用为止

此外,我建议还阅读第 6 缓冲区对象,尤其是

的部分

删除缓冲区

缓冲区对象被删除后,它没有内容,并且其名称再次未使用...缓冲区中已标记为用于 GenBuffer 目的的未使用名称将再次标记为未使用

绑定缓冲区

如果缓冲区对象在绑定时被删除,则当前上下文中(即调用DeleteBuffers的线程中)到该对象的所有绑定都将重置为零。在其他上下文中对该缓冲区的绑定不受影响,并且删除的缓冲区可以在其保持绑定或附加的任何位置继续使用,如第 5.1 节所述。

© www.soinside.com 2019 - 2024. All rights reserved.