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

时间:2017-01-07 11:08:17

标签: c++ opengl

我创建了一个VBO(顶点缓冲对象)和VAO(顶点数组对象),并且做到了这一点:

glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(...);
glVertexAttribPointer(...);
glEnableVertexAttribArray(0);
glBindVertexArray(0);

我可以在执行此操作后删除vbo,然后使用vao进行绘制,假设一切正常吗?

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

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

那可能是什么问题?

(顺便说一下,如果我不删除缓冲区,程序在我的计算机和我的朋友身上都有效)

1 个答案:

答案 0 :(得分: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驱动程序错误,要么就是你所描述的情况。