OpenGL程序/着色器未初始化

7

什么是正确的做法?

我正在执行以下步骤:

  1. 创建着色器(Shader)
  2. 编译着色器(Shader)
  3. 创建程序(Program)
  4. 将着色器(Shader)附加到程序(Program)
  5. 链接程序(Program)
  6. 删除着色器(Shader)

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除非我在正确分离它之后否则无用,对吗?

我应该在程序编译正确后分离和删除(以节省内存),还是只有在我的应用程序关闭时分离/删除?


注意事项:如果你使用glBindAttribLocation来更改属性绑定,那么你需要调用glLinkProgram才能使更改生效。因此,如果你从已链接的程序中删除或分离着色器,则属性绑定将无法在重新绑定着色器之前进行更改。 - PeterT
1个回答

7
所以,如果我不把它分离开,那么我的#6就没用了,对吧?
是的。GL的作用基本上是引用计数。只要其他对象引用着该着色器对象,它就会保持活动状态。如果你删除对象,则实际删除将被推迟,直到最后一个引用被移除。
我应该在程序正确编译后分离和删除(为了节省内存),还是仅在我的应用程序关闭时分离/删除?
这取决于您。您可以在不再需要它时立即删除它。如果您不打算重新链接该着色器,则可以在初始链接操作之后立即销毁所有附加的着色器对象。但是,着色器对象并没有消耗太多内存(而且不会进入GPU内存,仅最终程序会),如果稍后删除它们甚至不删除它们通常也不是大问题,因为当GL上下文被销毁时(包括应用程序退出的情况)所有的GL资源都将被销毁。当然,如果您在运行时动态创建着色器,则还应动态删除旧的和未使用的对象,以避免积累大量未使用的对象并有效地泄漏内存/对象名称等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接