opengl 全屏四画面的GLSL片段处理顺序

9nvpjoqh  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(164)

我正在使用GLSL进行一些图像处理,所以绘制了一个全屏四边形,并在片段着色器中进行处理。我想知道我们是否可以按照任何特定的优先级顺序处理片段?
我知道片段是并行处理的,我们不能保证任何特定片段的完成时间,那么这是如何处理的呢?它只是一个大队列吗?模式看起来会是什么样子,即扫描线,块等。
这是否取决于驱动程序?

5tmbdcev

5tmbdcev1#

没有文档说明,因为它是任意处理的。硬件具有以完全任意的顺序处理片段的能力;你不允许以任何方式、形式或形式知道片段处理的顺序。2没有控制来改变片段处理的顺序、影响该顺序,甚至根本检测它。
好吧,直到4.2和ARB_shader_image_load_store。但即使是这样,也有内置的控件,以允许硬件尽可能多的自由。
简而言之,如果你在做一些处理顺序很重要的事情,你就做错了。
在我看来,你好像在尝试做一个反馈循环,在这里你同时读取和写入帧缓冲区(通过绑定一个纹理并将同一个图像附加到一个FBO渲染目标)。
好吧,这是关于性能,而不是功能。
您可以假设您通常对CPU所做的假设:内存访问将被缓存。片段着色器进入的顺序无关紧要;它们中的一个将首先命中存储器,并且稍后命中它的那个该高速缓存中受益。
请记住:GPU是 * 优化 * 做这些东西。GPU销售的基础上如何快速纹理,着色器处理三角形渲染。实现知道如何纹理将被使用,你可以期待它不会愚蠢的排序它的输出片段。
如果你必须随机访问,那么你必须随机访问;你对此无能为力。但除此之外,你不应该浪费任何时间去担心或试图优化它。让硬件和驱动程序编写者做他们的工作吧。

gr8qqesn

gr8qqesn2#

回复@nicol-bolas的回复,因为我没有适当回复的声誉。
简而言之,如果你在做一些处理顺序很重要的事情,你就做错了。
某些算法依赖于这个顺序。滑动框过滤器(虽然只有在整数颜色存储时才可靠),它在任何窗口大小下都同样快,是一个非常值得注意的例子。其中2个将框变成三角形(双线性插值),3个生成很好的平滑二次曲线。
使用着色器中的条件,可以模拟算法的顺序性质,如下所示:

uniform sample2d tex;
uniform in wlen;

in vec2 texcoord;
in int shift;

vec4 shader() {
  if (int(texcoord.x) % wlen != shift)
    return texelFetch( tex, ivec2(texcoord), 0);
  ...
}

相关问题