我的代码以某种方式接近GLSL着色器管理,它创建每个着色器和相关程序并删除每个着色器和程序。我最近阅读http://www.opengl.org/wiki/GLSL_Object,并在那里声明:
由于附加到程序对象,着色器对象将会 即使删除着色器对象,也会继续存在。它只会 当系统不再附加到任何程序时被系统删除 对象(当然,当用户要求删除它时)。
我是否正确使用,如果在链接到程序后在着色器对象上调用glDeleteShader()
,我只需要跟踪程序?假设这一直是真的可以安全吗?
答案 0 :(得分:59)
是的 - 事实上,非常希望尽快分离和删除着色器对象。这样,驱动程序可以释放它用来保存着色器源和未链接目标代码副本的所有内存,这可能非常重要。我所做的测量表明,不删除着色器对象会使每个着色器的增量内存使用量增加5-10倍
答案 1 :(得分:13)
通常,着色器对象管理的工作方式很简单。着色器对象实际上并没有做任何东西,所以根本没有跟踪它们。着色器对象应该存在足够长的时间才能成功链接程序对象。在此之后,着色器应与程序分离并删除。
以上假设您不是在尝试使用着色器对象与其他程序进行链接。这当然是可能的。在这种情况下,您应该在链接完所有程序后删除着色器对象。
答案 2 :(得分:6)
是。您可以安全地删除着色器。事实上,这是首选方式,因为您的维护较少。您无需跟踪要删除的内容,也不会忘记这样做。而且,它仍然有效。
“删除”着色器,与所有 OpenGL对象一样,只是设置一个标记,表示你不再需要它。 OpenGL会在需要的时候保留它,并且会在以后的任何时候进行实际删除(最有可能,但不一定,在删除程序后)。
答案 3 :(得分:3)
简而言之:在glLinkProgram()
为每个着色器调用glDeleteShader()
之后,这标记为删除,当不再需要程序时调用glDeleteProgram()
- 此调用不仅会删除程序,还会删除程序还会分离附加到它上面的所有着色器并删除它们(如果没有被任何其他程序使用)。
通常你不必打电话给glDetachShader()
。
阅读glDeleteProgram()
的文档。