OpenGL 程序管道对象的正确用法/用途

Jag*_*oly 5 opengl shader

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

我的问题是,为什么我们需要程序管道对象?在我的渲染器中,我只有其中之一,我更改它的附件来更改着色器。我想不出在任何情况下您实际上想要不止一个。如果您存储许多管道对象,每个对象都包含着色器程序的不同组合,那么事情最终会比根本不使用单独的着色器更混乱。

那么,管道对象的用途是什么?更改附件是否比绑定不同的管道对象更昂贵?规范这样做的原因是什么,而不是让 glUseProgramStages 以与 glUseProgram 相同的方式操作?

Nic*_*las 6

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

通过将所有阶段链接在一起的程序,您可以在链接时检测到这些验证失败。所有这些测试都只进行一次,不再重复。

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

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


dar*_*ari 1

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

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

那么,管道对象的用途是什么?

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

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