所以我使用VAO存储来自VBO的指针。我想测试在绑定VAO并调用绘图之前删除数据缓冲区(vbo,ibo等)时会发生什么。由于VAO存储指向相应数据缓冲区中数据的指针,因此我预计渲染器会崩溃。但是,一切都在继续。这怎么可能?我正在使用WebGL 2.0上下文。文档指出VAO是根据OpenGL文档实现的。这与JavaScript如何处理对象有关吗?在我调用deleteBuffer之前,也许我的vbo在某个地方(不知不觉)被缓存了。这可能吗?这里发生了什么?
答案 0 :(得分: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 Specification 3.2 - 5.1.3 Deleted Object and Object Name Lifetimes, page 45:
当成功删除缓冲区,纹理,变换反馈或渲染缓冲对象时,它将从当前上下文中绑定的任何绑定点解除绑定,并与绑定到当前上下文的容器对象的任何附件分离。 ...
未绑定容器对象的附件,例如删除附加到未绑定到上下文的顶点数组对象的缓冲区,不会受到影响,并继续充当已删除对象的引用....
当删除缓冲区,查询,渲染缓冲区,采样器,同步或纹理对象时,其名称会立即变为无效(例如标记为未使用),但在不再使用基础对象之前,不会删除它。 / p>