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

Javascript WebGL 2.0:即使删除VBO,绘图调用也会成功,javascript,vao,webgl2,Javascript,Vao,Webgl2,因此,我使用VAO来存储来自VBO的指针。我想测试在绑定VAO和调用绘图之前删除数据缓冲区(vbo、ibo等)时会发生什么。由于VAOs将指向数据的指针存储在相应的数据缓冲区中,因此我预计渲染器会崩溃。然而,一切都在继续。这怎么可能?我正在使用WebGL 2.0上下文。文档说明VAOs是根据OpenGL文档实现的。这与JavaScript如何处理对象有关吗?也许我的vbo在调用deleteBuffer之前(不知不觉地)缓存到了某个地方。这可能吗?这里发生了什么?如果gl尝试删除缓冲区对象。Del

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

如果gl尝试删除缓冲区对象。DeleteBuffers,则如果缓冲区对象附加到未绑定的顶点数组对象,则缓冲区对象不会被删除。在这种情况下,对象的名称将变为无效,并标记为未使用:


但如果顶点数组对象已绑定,则缓冲区对象将分离并删除:

gl.bindVertexArray( vao );
gl.bindBuffer( gl.ARRAY_BUFFER, vbo );
gl.vertexAttribPointer( ... );
.....
gl.deleteBuffers( 1, vbo );
gl.bindVertexArray( 0 ); 

见:

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

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

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


仅供参考,OpenGL ES中的对象删除行为是大多数驱动程序中未经测试的部分。WebGL应该做得更好,对于着色器/程序,已经对删除的着色器和程序的行为进行了广泛的测试。对于VAOs,它也应该进行测试,但对于WebGL1,它没有进行测试。。我们忘了。WebGL2已经过测试,但Chrome还没有通过。这是跟踪问题的关键。@gman哦,我没有读WebGL标签,我只读了问题,我的错。我现在更改了代码并参考了OpenGL ES。很抱歉没有说清楚。。。天哪,我在使用webgl 2.0上下文,但我在chrome中测试。谢谢你的意见。
gl.bindVertexArray( vao );
gl.bindBuffer( gl.ARRAY_BUFFER, vbo );
gl.vertexAttribPointer( ... );
.....
gl.deleteBuffers( 1, vbo );
gl.bindVertexArray( 0 );