【问题标题】:OpenGL program/shader uninitializationOpenGL程序/着色器未初始化
【发布时间】:2013-08-29 16:55:28
【问题描述】:

这样做的正确方法是什么?

我正在执行以下步骤:

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

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 是没用的,除非我把它拆下来对吧?

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

【问题讨论】:

  • 旁注:您需要调用glLinkProgram 对与glBindAttribLocation 绑定的属性所做的更改才能生效。因此,如果您从链接的程序中删除和分离着色器,那么如果不重新绑定着色器,属性绑定就无法有效地更改。

标签: opengl


【解决方案1】:

所以我的#6 是没用的,除非我把它拆下来对吧?

是的。 GL 所做的基本上是引用计数。只要其他对象引用着色器对象,它就会保持活动状态。如果您删除对象,实际删除将推迟到最后一个引用被删除。

程序编译后我应该分离和删除吗 正确(以节省内存)或者我应该只在我的 应用程序正在关闭?

这取决于你。您可以在您不再需要它时立即将其删除。如果您不打算重新链接该着色器,您可以在初始链接操作后立即销毁所有附加的着色器对象。但是,着色器对象毕竟不会消耗太多内存(并且不会进入 GPU 内存,只有最终程序会)。如果您稍后删除它们,或者甚至不删除它们,通常没什么大不了的all,因为当 GL 上下文被销毁时(包括应用程序退出的情况),所有的 GL 资源都会被销毁。当然,如果你在运行时动态创建着色器,你还应该动态删除旧的和未使用的对象,以避免积累大量未使用的对象并有效地泄漏内存/对象名称等。

【讨论】:

    猜你喜欢
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 2017-05-16
    • 2022-10-14
    相关资源
    最近更新 更多