正确的方法来删除GLSL着色器?

我的代码以这种方式接近GLSL着色器pipe理,它创build每个着色器和相关程序,并删除每个着色器和程序。 我最近读了http://www.opengl.org/wiki/GLSL_Object ,那里说:

由于被附加到程序对象,着色器对象将继续存在,即使删除了着色器对象。 只有当系统不再附加到任何程序对象(当然用户要求删除它)时,它才会被系统删除。

如果我在链接到程序后在着色器对象上调用glDeleteShader() ,我只需要跟踪该程序,我可以正确地得到这个结果吗? 假设这总是正确的,是否安全?

是的 – 事实上,我们非常希望尽快分离和删除着色器对象。 这样,驱动程序就可以释放所有正在使用的内存,以保存着色器源代码和未链接的目标代码的副本,这些代码可能相当实用。 我所做的测量表明,不删除着色器对象会使每着色器的增量内存使用量增加5-10倍

通常,着色器对象pipe理的工作方式很简单。 着色器对象实际上并没有任何事情,所以跟踪它们根本没有意义。 着色器对象应该存在足够长的时间才能成功链接一个程序对象。 在此之后,着色器应该从程序中分离出来并删除。

上面假定你没有试图使用着色器对象来链接不同的程序,当然。 这当然是可能的。 在这种情况下,在链接所有程序后,应该删除着色器对象。

是。 然后,您可以安全地删除着色器。 事实上,这是首选的方式,因为你有较less的维护。 你不需要跟踪要删除的内容,也不能忘记这么做。 而且,它仍然会工作。

所有 OpenGL对象一样,“删除”着色器只是设置一个标志,表示不再需要它。 OpenGL将会保持它自己需要的时间,并且会在后面的任何时候(最有可能,但不一定是在程序被删除之后)执行实际的删除操作。

简而言之:在glLinkProgram()为每个着色器调用glDeleteShader() ,这glDeleteShader()其标记为删除,并且在程序不再需要时调用glDeleteProgram() – 此调用不仅会删除程序,而且会glDeleteProgram()所有着色器并删除他们(如果没有被任何其他程序使用)。

所以通常你不必调用glDetachShader() 。 阅读glDeleteProgram()的文档。