执行此操作的正确方法是什么?
我正在执行以下步骤:
- 创建着色器
- 编译着色器
- 创建程序
- 将着色器附加到程序
- 链接程序
- 删除着色器
在 http://www.opengl.org/wiki/GLSL_Object它说:即使在链接程序之后,您也不必显式分离着色器对象。但是,最好在链接完成后执行此操作,否则当您尝试删除附加的着色器对象时,程序对象将使其保持事件状态。
也来自Proper way to delete GLSL shader?说如果我不删除着色器,它会增加内存。
所以检查http://www.opengl.org/sdk/docs/man/xhtml/glDetachShader.xml ,它表示如果着色器已通过调用 glDeleteShader 被标记为删除,并且它未附加到任何其他程序对象,则在分离后它将被删除。
所以我的 #6 是没有用的,除非我在正确之后将其分离?
我应该在程序正确编译后分离并删除(以节省内存)还是应该仅在我的应用程序关闭时分离/删除?
最佳答案
So my #6 is useless unless I detach it after right?
是的。 GL 所做的基本上就是引用计数。只要其他对象引用该着色器对象,它就会保持事件状态。如果删除该对象,实际删除将推迟到最后一个引用被删除为止。
Should I detach and delete after the Program has been compiled correctly (to save the memory) or should I detach/delete only when my application is closing down?
这取决于你。一旦您不再需要它,可以将其删除。如果您不打算重新链接该着色器,则可以在初始链接操作后立即销毁所有附加的着色器对象。然而,着色器对象毕竟不会消耗太多内存(并且不会进入 GPU 内存,只有最终的程序才会),如果您稍后删除它们,或者甚至不删除它们,通常也没什么大不了的。 all,因为当GL上下文被销毁时(包括应用程序退出的情况),所有的GL资源都会被销毁。当然,如果您在运行时动态创建着色器,您还应该动态删除旧的和未使用的对象,以避免积累大量未使用的对象并有效泄漏内存/对象名称等。
关于OpenGL 程序/着色器未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18516798/