我应该在`glUseProgramStages`之后删除可分离的程序吗?

时间:2018-08-20 14:31:55

标签: opengl

如果我创建了一堆可分离的程序对象并将其放入程序管道中,我应该立即调用glDeleteProgram还是必须延长它们的管道寿命?

https://www.khronos.org/opengl/wiki/Shader_Compilation#Separate_programs说流水线对象是容器对象,而https://www.khronos.org/opengl/wiki/OpenGL_Object#Deletion_orphaning说流水线对象是容器中的对象,正在使用而不是删除。

为了进行比较,我看到了很多示例,一旦将它们链接到程序中,就会在着色器上调用glDeleteShader(例如https://www.khronos.org/opengl/wiki/Shader_Compilation#Cleanup特别推荐这样做)。

我已经尝试过将程序从其管道中删除,但似乎没有受到损害,但是我当然并不依赖于此。

2 个答案:

答案 0 :(得分:2)

将着色器对象链接到程序对象后经常将其删除的原因是,着色器对象与程序无关。链接的程序包含来自链接在一起的着色器对象的所有代码。您可以将这些着色器从程序中分离出来,这对成功链接的程序对象的影响为零。

那不是管道对象的情况。管线仅包含用于渲染的单独程序。他们不会从他们那里吸收信息。现在是的,它们确实保留了附加对象的生命周期,但是它们并不独立于那些对象而存在。

分离这些对象,管道将没有代码可用于阶段。

此外,如果删除程序,将如何更改其制服?您甚至不能使用glActiveShaderProgram,因为您实际上需要拥有程序对象。当然,您可以使用glGetProgramPipelineiv来获取特定阶段的(现在已删除)程序名称,但是为什么要这样做呢? glGet个通话的性能未知。

那么,你能做到吗?是。这是个好主意吗?不。

最后,由于人们通常不这样做,因此依赖于此类删除孤立和查询已删除对象名称是很危险的。它为您打开了许多驱动程序错误。在某些情况下,OpenGL实现会从新的glGen调用中返回孤立的名称。

答案 1 :(得分:0)

  

如果对于任何GL上下文而言,程序都不是当前程序,对于任何程序管线对象而言,该程序不是活动程序,对于任何程序管线对象而言,对于任何阶段而言,它都不是当前程序,则将其立即删除。否则,程序将标记为删除,并且在所有这些条件都变为真之后将被删除。

The OpenGL® Graphics System, Version 4.1, Core Profile,2010年7月25日,第41页。 60.-§2.11.3着色器对象。

是的,可以根据规格以及所描述的行为适合您。最好不要执行此操作,因为驱动程序实现中可能存在错误,例如在我的PC上,program会被删除,尽管事实上它在当前上下文中处于活动状态。