将"Vertex Buffer Object"绑定到"Vertex Array Objects"后,我应该删除它吗?

Joh*_*Miz 10 c++ opengl

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

glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(...);
glVertexAttribPointer(...);
glEnableVertexAttribArray(0);
glBindVertexArray(0);
Run Code Online (Sandbox Code Playgroud)

我可以删除vbo之后我做了这个,然后绘制vao假设一切都井然有序吗?

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

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

可能是什么问题?

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

ybu*_*ill 7

是的,根据OpenGL 4.5,取消绑定VAO后删除它是合法.

2.6.1.2删除名称和删除对象

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

5.1.2删除对象的自动解除绑定

删除缓冲区,纹理或渲染缓冲区对象时,它将从当前上下文中绑定的任何绑定点解除绑定,并与绑定到当前上下文的容器对象的任何附件分离,如针对DeleteBuffers,DeleteTextures所述和DeleteRenderbuffers.[...] 未绑定容器对象的附件(例如删除附加到未绑定到上下文的顶点数组对象的缓冲区)不受影响,并继续充当已删除对象的引用,如下所述部分.

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

删除缓冲区,纹理,采样器,渲染缓冲区,查询或同步对象时,其名称将立即变为无效(例如,标记为未使用),但在不再使用基础 对象之前不会删除它.

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

  • 该对象附加到任何容器对象
  • [...]

所以要么它是一个AMD驱动程序错误,要么情况不像你描述的那样.