OpenGL程序/着色器未初始化

Dan*_*cco 6 opengl

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

我正在做这些步骤:

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

http://www.opengl.org/wiki/GLSL_Object中,它说:即使在链接程序之后,您也不必显式分离着色器对象.但是,一旦链接完成,最好这样做,否则当您尝试删除它们时,程序对象将保持其附加的着色器对象处于活动状态.

还有从正确的方式删除GLSL着色器?如果我不删除着色器,它会增加内存.

因此,对检查http://www.opengl.org/sdk/docs/man/xhtml/glDetachShader.xml,它说,如果着色器已经通过向glDeleteShader呼叫标记为删除,并没有连接到任何其他程序对象,它将在分离后删除.

所以我的#6是无用的,除非我在正确之后分开它?

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

der*_*ass 5

所以我的#6是无用的,除非我在正确之后分开它?

是.GL所做的基本上是参考计数.只要某个其他对象引用着色器对象,它就会保持活跃状态​​.如果删除该对象,将删除实际删除,直到删除最后一个引用.

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

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