gpt4 book ai didi

opengl - OpenGL程序管道对象的正确用法/目的

转载 作者:行者123 更新时间:2023-12-03 22:45:36 29 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

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

关于opengl - OpenGL程序管道对象的正确用法/目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32798024/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com