OpenGL程序管道对象

时间:2015-09-26 14:05:00

标签: opengl shader

使用OpenGL 4.1和ARB_separate_shader_objects,我们可以在着色器程序中存储着色管道的不同阶段。我们知道,要使用它们,我们需要将它们附加到程序管道对象,然后绑定它。

我的问题是,为什么我们需要程序管道对象呢?在我的渲染器中,我只有其中一个,我更改它的附件以更改着色器。我无法想到你实际上想要不止一个这样的情况。如果存储许多管道对象,每个管道对象包含着色器程序的不同组合,那么事情最终会比不使用单独的着色器更加混乱。

那么,管道对象的目的是什么?更改附件(更多)比绑定不同的管道对象更昂贵吗?该规范有什么原因,而不是说glUseProgramStages的运行方式与glUseProgram相同?

2 个答案:

答案 0 :(得分:2)

管道对象存在的主要原因是在程序对象中将阶段链接在一起确实具有某些优点。例如,有许多着色器间阶段验证规则。如果单独程序的顺序无效,那么人们需要知道。

使用将所有阶段链接在一起的程序,您可以在链接时检测这些验证失败。所有这些测试都是一次,而不是更多。

如果您使“glUseProgramStages以与glUseProgram相同的方式运行”,那么每次使用一组新的着色器进行渲染,系统将不得不进行阶段间验证测试。管道代表了缓存此类测试的便捷方式。如果您将程序设置一次并且之后从不修改它们,那么管道验证的结果将永远不会改变。因此,验证只发生一次,就像多阶段程序一样。

另一个问题是,在将某些程序相互关联时,实现可能需要执行一些小的着色器修复工作。管道对象代表了缓存此类修复工作的便利位置。没有它们,每次更改着色器时都必须完成它们。

答案 1 :(得分:0)

  

为什么我们需要程序管道对象?

我们没有需要程序管道对象,它们纯粹是可选的。对每个正在使用的着色器组合使用一个程序对象是最简单和最常用的方法。

  

那么,管道对象的目的是什么?

来自https://www.opengl.org/registry/specs/ARB/separate_shader_objects.txt

  

[...]许多开发人员在其周围构建着色器内容   混合和匹配方法,他们可以使用单个顶点着色器   多个片段着色器(反之亦然)。此扩展程序采用"混合匹配" GLSL的着色器阶段模型       允许一次绑定多个不同的GLSL程序对象       每个独立于一个单独的渲染管道阶段       其他阶段绑定。这允许程序对象仅包含       最适合应用需求的着色器阶段。 [...]