我创建了一个VBO(顶点缓冲对象)和VAO(顶点数组对象),并且做到了这一点:
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(...);
glVertexAttribPointer(...);
glEnableVertexAttribArray(0);
glBindVertexArray(0);
我可以在执行此操作后删除vbo
,然后使用vao
进行绘制,假设一切正常吗?
我知道缓冲区绑定到vao
所以我假设我可以。
问题是,如果我删除计算机上的缓冲区(英特尔图形),它运行良好(一切都正确显示),但在我的朋友计算机(AMD)上没有任何显示。
那可能是什么问题?
(顺便说一下,如果我不删除缓冲区,程序在我的计算机和我的朋友身上都有效)
答案 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驱动程序错误,要么就是你所描述的情况。