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

OpenGL程序管道对象的正确用法/用途,opengl,shader,Opengl,Shader,使用OpenGL 4.1和ARB_单独的_着色器_对象,我们能够在着色器程序中存储着色管道的不同阶段。正如我们所知,要使用它们,我们需要将它们附加到程序管道对象,然后将其绑定 我的问题是,为什么我们需要程序管道对象?在渲染器中,我只有其中一个,我将其附件更改为更改着色器。我想不出有哪种情况下你会想要不止一个。如果存储了许多管道对象,每个管道对象都包含不同的着色器程序组合,那么结果会比根本不使用单独的着色器更混乱 那么,管道对象的用途是什么?更改附件是否比绑定不同的管道对象更昂贵?是什么原因使规范

使用OpenGL 4.1和ARB_单独的_着色器_对象,我们能够在着色器程序中存储着色管道的不同阶段。正如我们所知,要使用它们,我们需要将它们附加到程序管道对象,然后将其绑定

我的问题是,为什么我们需要程序管道对象?在渲染器中,我只有其中一个,我将其附件更改为更改着色器。我想不出有哪种情况下你会想要不止一个。如果存储了许多管道对象,每个管道对象都包含不同的着色器程序组合,那么结果会比根本不使用单独的着色器更混乱

那么,管道对象的用途是什么?更改附件是否比绑定不同的管道对象更昂贵?是什么原因使规范有这样的功能,而不是像glUseProgramStages那样以与glUseProgram相同的方式运行

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

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

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

发件人:

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


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

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

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


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

看来您完全误解了我的问题。我不是在问为什么要使用单独的着色器对象。只是需要管道对象能够使用它们。好的,很抱歉,我仍然不理解您的问题。那么您将如何配置特定的完整管道?您是否更愿意“绑定”各个部分,而不是创建一个引用它们并可以一次性设置整个管道的对象?这就是我的观点:这真的没有任何帮助。如果这样存储管道对象,那么为什么要使用单独的着色器呢?仅为某些组合存储管道是不一致的,但为所有组合存储管道将首先破坏分离着色器的目的。