顶点缓冲区对象(删除进程)opengl

Posted

技术标签:

【中文标题】顶点缓冲区对象(删除进程)opengl【英文标题】:Vertex Buffer Objects (Delete process) opengl 【发布时间】:2012-05-13 17:20:25 【问题描述】:

我应该什么时候调用 glDeleteBuffersARB ?申请结束时我应该这样做吗?我可以以某种方式自动化删除顶点缓冲区对象的过程吗?例如 smart_ptr 之类的东西。

【问题讨论】:

不再使用时删除。 hm,那么我可以使用析构函数为 vbo 创建类来删除 vbo 对象吗?然后将对象创建为 smart_ptr 以使一切自动化? 【参考方案1】:

从来没有。你永远不应该打电话给glDeleteBuffersARB。十多年来,缓冲区对象一直是 GL 的核心功能。如果您仍在使用带 ARB 后缀的扩展功能,STOP。如果您按照使用它们的教程进行操作,请再次STOP;它显然太旧了,无法使用。

现在,您应该什么时候使用glDeleteBuffers?您应该将它与 delete 用于常规 C++ 对象的同时使用。也就是说,当您完成 对象时使用它。当您不再使用它并想摆脱它时。

那么我可以用析构函数为 vbo 创建类,它会删除 vbo 对象吗?然后将对象创建为 smart_ptr 以使一切自动化?

你可以,但它不会让你买那么多。此外,您冒着非常真实的风险,即等待删除对象,直到为时已晚。

在创建 OpenGL 上下文之前(并使其成为当前)或当 GL 上下文不是当前时(例如,在您销毁 GL 上下文之后)调用任何 OpenGL 函数都是非法的。尝试这样做并不好。

如果您使用shared_ptr 来管理这些资源,理论上它们可能会比实际的 OpenGL 上下文更长寿。那很糟。就个人而言,我更喜欢一种更严格的管理方案,将 GL 对象的生命周期与上下文的生命周期牢固地联系起来。

【讨论】:

好吧,您可以将上下文封装在它自己的类实例中,并将 shared_ptr 或 weak_ptr 作为初始化参数传递给任何 OpenGL 对象类。其实我认为要正确地将OpenGL包装到C++类中,OpenGL对象类实例应该只由上下文类的工厂函数返回。 我还是觉得shared_ptr对OpenGL资源管理有好处。它仍然可以用来“间接”管理它们——这样删除资源包装类就不会调用 glDelete*,而是将此资源标记为“已释放”,以便它们可以在适当的一段时间后被 glDeleted(例如,当尊重上下文成为当前时) .这不会阻止上下文管理器类在上下文被销毁之前删除(glDelete)这些资源,即使它们没有被提到的包装类标记为“空闲”。

以上是关于顶点缓冲区对象(删除进程)opengl的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL复制顶点缓冲区对象

OpenGL顶点缓冲区对象不起作用

OpenGL 顶点数组对象是存储顶点缓冲区名称和索引,还是只存储索引?

在交错的 openGL 顶点缓冲区对象之间复制

OpenGL顶点缓冲区对象的动态打包数据

在OpenGL中,除非我再次重新指定顶点属性,否则为啥我的缓冲区对象不会绘制?