WebGL 2.0:即使删除 VBO,绘图调用也会成功

问题描述 投票:0回答:1

所以我使用 VAO 来存储来自 VBO 的指针。我想测试在绑定 VAO 并调用绘图之前删除数据缓冲区(vbo、ibo 等)时会发生什么。由于 VAO 在相应的数据缓冲区中存储指向数据的指针,因此我预计渲染器会崩溃。然而,一切都在继续进行。这怎么可能?我正在使用 WebGL 2.0 上下文。文档指出 VAO 是根据 OpenGL 文档实现的。这与 JavaScript 处理对象的方式有关吗?也许我的 vbo 在我调用 deleteBuffer 之前被缓存在某个地方(不知不觉地)。这可能吗?这里发生了什么?

javascript webgl webgl2 vao
1个回答
4
投票

如果尝试通过

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 页

当成功删除缓冲区、纹理、变换反馈或渲染缓冲区对象时,它将与当前上下文中绑定的任何绑定点解除绑定,并与绑定到当前上下文的容器对象的任何附件分离... .

未绑定容器对象的附件,例如删除附加到未绑定到上下文的顶点数组对象的缓冲区,不受影响并继续充当已删除对象的引用....

当删除缓冲区、查询、渲染缓冲区、采样器、同步或纹理对象时,其名称立即变得无效(例如标记为未使用),但底层对象在不再使用之前不会被删除。

© www.soinside.com 2019 - 2024. All rights reserved.