退出时删除多个着色器?

Posted

技术标签:

【中文标题】退出时删除多个着色器?【英文标题】:Delete multiple shaders on exit? 【发布时间】:2011-11-15 07:35:32 【问题描述】:

假设我在我的 opengl 程序中成功加载了 5 个 GLSL 着色器。当我想退出游戏时,我当然要删除着色器。所以要删除着色器,我必须:

    从程序中分离着色器 删除着色器 删除着色器程序

为每个带有 glDeleteShader、glDeleteProgram 等的着色器一一对应? 有没有更简单的方法?

【问题讨论】:

关于“更简单/更简单的方式”,从 C++11 开始,我们已经共享指针,并且可以在任何地方使用 RAII。这意味着您永远不会真正删除任何内容,当变量超出范围时,会调用析构函数并自动进行清理。 【参考方案1】:

为什么要等到应用程序结束才删除着色器对象?在为它们链接程序后,您应该摆脱它们。只需将它们附加到程序、链接、分离它们并删除(除非您正在重用着色器对象)。

一旦您不再携带着色器对象的包袱,这很简单。只需删除程序即可。

或者不要。由你决定; OpenGL 上下文将自行清理。但是,如果您想删除它们,请删除它们。

如果您将它们保存在 50 个不同的变量中来存储程序,并且不想输入 glDeleteProgram 50 次,那么很明显您的代码结构不适合其大小。如果您有这么多程序,那么您需要采购一个资源管理系统,您可以在其中管理资源(如加载的程序)并确保它们被销毁。我所说的“采购”是指“写”。

资源管理器基本上是盒子,您可以将命名对象放入其中,然后将它们取出。当资源管理器被销毁时,它管理的所有资源也会被销毁(注意:有一些方法可以使资源管理器具有替代的销毁方式)。

【讨论】:

以上是关于退出时删除多个着色器?的主要内容,如果未能解决你的问题,请参考以下文章

跨多个着色器的 OpenGL 统一

OpenGLES3.0创建和编译着色器相关语法

GLSL 问题:一个程序中有多个着色器

跨不同着色器使用多个 image2d 的问题

OpenGL/C++:将多个纹理传递给一个着色器的问题

具有多个着色器程序的 OpenGL 多纹理