C++ 将“顶点缓冲区对象”绑定到“顶点数组对象”后,是否应删除该对象?

C++ 将“顶点缓冲区对象”绑定到“顶点数组对象”后,是否应删除该对象?,c++,opengl,C++,Opengl,我创建了VBO(顶点缓冲区对象)和VAO(顶点数组对象),并执行了以下操作: glBindVertexArray(vao); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(...); glVertexAttribPointer(...); glEnableVertexAttribArray(0); glBindVertexArray(0); 假设一切正常,我是否可以先删除vbo,然后用vao绘图 我知道缓冲区绑定到vao,所以我假设我可以 问

我创建了VBO(顶点缓冲区对象)和VAO(顶点数组对象),并执行了以下操作:

glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(...);
glVertexAttribPointer(...);
glEnableVertexAttribArray(0);
glBindVertexArray(0);
假设一切正常,我是否可以先删除
vbo
,然后用
vao
绘图

我知道缓冲区绑定到
vao
,所以我假设我可以

问题是,如果我在我的计算机(英特尔图形)上删除缓冲区,它工作得很好(所有内容都正确显示),但在我的朋友计算机(AMD)上没有显示任何内容

有什么问题吗


(顺便说一句,如果我不删除缓冲区,程序可以在我的计算机和我朋友的计算机上运行)

是的,根据OpenGL 4.5,在解除VAO绑定后删除它是合法的

2.6.1.2名称删除和对象删除 如果在GL上下文当前正在使用某个对象时删除了该对象,则该对象的名称 会立即标记为未使用,并且会自动删除某些类型的对象 如第5.1.2节所述,从当前上下文中的绑定点解除绑定。 但是,实际的基础对象在不再使用之前不会被删除。 第5.1.3节详细讨论了这种情况

5.1.2删除对象的自动解除绑定 删除缓冲区、纹理或renderbuffer对象时,它将与任何对象解除绑定 绑定点它在当前上下文中绑定到,并与任何附件分离 绑定到当前上下文的容器对象,如DeleteBuffers、DeleteTextures和DeleteRenderbuffers所述。[…]未绑定容器的附件 对象,例如删除附加到顶点数组对象的缓冲区 绑定到上下文,不受影响并继续作为 已删除对象,如下节所述

5.1.3删除的对象和对象名称生命周期 删除缓冲区、纹理、采样器、renderbuffer、查询或同步对象时,其 名称立即变为无效(例如标记为未使用),但基础 对象在不再使用之前不会被删除

如果满足以下任一条件,则缓冲区、纹理、采样器或渲染缓冲对象正在使用中:

  • 该对象将附着到任何容器对象
  • [……]

所以要么是AMD驱动程序的缺陷,或者情况与您描述的不一样。

我刚切换到SDL,现在所有内容都被绘制,但当我退出程序时,我得到一个异常,在
wglDeleteContext
上显示
访问冲突
,之前我使用了GLFW,没有绘制任何内容,但退出程序时我没有得到任何异常。(SDL上的错误来自
atioglxx.dll
)@JohnMiz:你是说在AMD上?它要么是AMD缺陷,要么是代码中没有显示的缺陷。我还回答了基于OpenGL 4.5规范的问题,因为您没有说明使用哪个版本。在旧版本上,它可能会有不同的行为,或者没有定义。欢迎您自己查看这些规格,它们是免费提供的,而且非常容易让人阅读。@JohnMiz:应该注意的是,仅仅因为某些东西是“合法的”,并不意味着它是一个好主意。不要删除对象,除非你已经完成了这些操作。@ybungalobill:还有一个事实,如果你想移动到Vulkan,当你执行类似于删除对象的操作时,你不能依靠驱动程序来保存你。在这样的API中,删除意味着立即消失。最好现在就训练自己去承担“认知负担”,而不是在需要的时候不去承担。