OpenGL程序/着色器取消初始化

OpenGL程序/着色器取消初始化,opengl,Opengl,正确的方法是什么 我正在执行以下步骤: 创建着色器 编译着色器 创建程序 将着色器附加到程序 链接程序 删除着色器 其中说:即使在链接程序之后,也不必显式分离着色器对象。但是,在链接完成后执行此操作是一个好主意,否则当您尝试删除程序对象时,程序对象将使其附加的着色器对象保持活动状态 还有from说如果我不删除着色器,它会增加内存 所以检查一下,它说如果着色器已经通过调用glDeleteShader被标记为删除,并且它没有附加到任何其他程序对象,那么它将在分离后被删除 所以我的#6是没用的,除非我

正确的方法是什么

我正在执行以下步骤:

  • 创建着色器
  • 编译着色器
  • 创建程序
  • 将着色器附加到程序
  • 链接程序
  • 删除着色器
  • 其中说:即使在链接程序之后,也不必显式分离着色器对象。但是,在链接完成后执行此操作是一个好主意,否则当您尝试删除程序对象时,程序对象将使其附加的着色器对象保持活动状态

    还有from说如果我不删除着色器,它会增加内存

    所以检查一下,它说如果着色器已经通过调用glDeleteShader被标记为删除,并且它没有附加到任何其他程序对象,那么它将在分离后被删除

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

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

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

    对。德国劳埃德船级社所做的基本上是参考计数。只要其他对象引用着色器对象,它就会保持活动状态。如果删除对象,实际删除将推迟到删除最后一个引用

    我应该在程序编译后分离并删除吗 正确(保存内存)或仅当 申请正在关闭


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

    旁注:您需要调用
    glLinkProgram
    ,以使使用
    glBindAttribLocation
    对属性绑定所做的更改生效。因此,如果从链接程序中删除并分离着色器,则如果不将着色器重新绑定到该程序,则无法有效地更改属性绑定。