OpenGL4.5中VAO绑定Buffer删除后状态及存储Buffer ID合理性问询
VAO类中存储绑定Buffer的ID是否合理?
完全合理。虽然OpenGL的VAO本身会内部记录绑定的Buffer对象,但在封装类里存下这个ID能让你更方便地做后续操作——比如快速检查当前绑定的Buffer、动态替换绑定的Buffer、甚至在VAO销毁时统一清理关联的Buffer资源(如果你的封装逻辑需要的话)。唯一要注意的是做好生命周期管理,避免出现ID悬空(比如Buffer已经被真正销毁但VAO类里还存着旧ID)的情况。调用glDeleteBuffers删除该Buffer后,只要它仍附着在至少一个VAO上,该Buffer及其ID是否会保持有效?
是的,会保持有效。OpenGL采用延迟删除机制:当你调用glDeleteBuffers时,只是把这个Buffer标记为「待删除」状态,并不会立刻销毁它。只要还有VAO(或者其他OpenGL对象)引用这个Buffer,它就会一直保持有效,对应的ID也依然和这个Buffer绑定,直到所有引用它的对象都解除了绑定,或者这些对象本身被销毁,这个Buffer才会真正被释放。是否会仅删除内容但保留ID并仍附着于VAO?
不会。glDeleteBuffers不会直接删除Buffer的内容或者保留空ID附着在VAO上。只要VAO还附着着这个Buffer,它的所有状态(包括存储的数据、内存参数等)都会完整保留,ID也依然指向这个有效的Buffer对象。只有当没有任何对象再引用它时,OpenGL才会真正销毁这个Buffer的所有资源,此时ID才会被回收,可能被后续的glGenBuffers调用复用。
内容的提问来源于stack exchange,提问作者Newline

