所以我使用 VAO 来存储来自 VBO 的指针。我想测试在绑定 VAO 并调用绘图之前删除我的数据缓冲区(vbo、ibo 等)时会发生什么。由于 VAO 将指向数据的指针存储在相应的数据缓冲区中,因此我预计渲染器会崩溃。但是,一切都在继续工作。这怎么可能?我正在使用 WebGL 2.0 上下文。该文档指出 VAO 是根据 OpenGL 文档实现的。这是否与 JavaScript 如何处理对象有关?也许我的 vbo 在我调用 deleteBuffer 之前被缓存在某个地方(不知不觉)。这可能吗?这里发生了什么?
1 回答
3
如果尝试删除缓冲区对象,则如果缓冲区对象附加到未绑定的顶点数组对象,则不会gl.DeleteBuffers
删除该缓冲区对象。在这种情况下,对象的名称变得无效并被标记为未使用:
gl.bindVertexArray( vao );
gl.bindBuffer( gl.ARRAY_BUFFER, vbo );
gl.vertexAttribPointer( ... );
.....
gl.bindVertexArray( 0 );
gl.deleteBuffers( 1, vbo );
但是如果顶点数组对象被绑定,那么缓冲区对象被分离并删除:
gl.bindVertexArray( vao );
gl.bindBuffer( gl.ARRAY_BUFFER, vbo );
gl.vertexAttribPointer( ... );
.....
gl.deleteBuffers( 1, vbo );
gl.bindVertexArray( 0 );
请参阅OpenGL ES 规范 3.2 - 5.1.3 已删除对象和对象名称生命周期,第 45 页:
当缓冲区、纹理、变换反馈或渲染缓冲区对象被成功删除时,它与当前上下文中绑定的任何绑定点解除绑定,并与绑定到当前上下文的容器对象的任何附件分离。
未绑定容器对象的附件,例如删除附加到未绑定到上下文的顶点数组对象的缓冲区,不受影响并继续充当已删除对象的引用...。
当缓冲区、查询、渲染缓冲区、采样器、同步或纹理对象被删除时,其名称立即变为无效(例如,标记为未使用),但在不再使用之前不会删除底层对象。
于 2017-11-14T16:28:27.783 回答