我正在使用GLSL进行一些图像处理,所以绘制了一个全屏四边形,并在片段着色器中进行处理。我想知道我们是否可以按照任何特定的优先级顺序处理片段?我知道片段是并行处理的,我们不能保证任何特定片段的完成时间,那么这是如何处理的呢?它只是一个大队列吗?模式看起来会是什么样子,即扫描线,块等。这是否取决于驱动程序?
5tmbdcev1#
没有文档说明,因为它是任意处理的。硬件具有以完全任意的顺序处理片段的能力;你不允许以任何方式、形式或形式知道片段处理的顺序。2没有控制来改变片段处理的顺序、影响该顺序,甚至根本检测它。好吧,直到4.2和ARB_shader_image_load_store。但即使是这样,也有内置的控件,以允许硬件尽可能多的自由。简而言之,如果你在做一些处理顺序很重要的事情,你就做错了。在我看来,你好像在尝试做一个反馈循环,在这里你同时读取和写入帧缓冲区(通过绑定一个纹理并将同一个图像附加到一个FBO渲染目标)。好吧,这是关于性能,而不是功能。您可以假设您通常对CPU所做的假设:内存访问将被缓存。片段着色器进入的顺序无关紧要;它们中的一个将首先命中存储器,并且稍后命中它的那个该高速缓存中受益。请记住:GPU是 * 优化 * 做这些东西。GPU销售的基础上如何快速纹理,着色器处理三角形渲染。实现知道如何纹理将被使用,你可以期待它不会愚蠢的排序它的输出片段。如果你必须随机访问,那么你必须随机访问;你对此无能为力。但除此之外,你不应该浪费任何时间去担心或试图优化它。让硬件和驱动程序编写者做他们的工作吧。
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); ... }
2条答案
按热度按时间5tmbdcev1#
没有文档说明,因为它是任意处理的。硬件具有以完全任意的顺序处理片段的能力;你不允许以任何方式、形式或形式知道片段处理的顺序。2没有控制来改变片段处理的顺序、影响该顺序,甚至根本检测它。
好吧,直到4.2和ARB_shader_image_load_store。但即使是这样,也有内置的控件,以允许硬件尽可能多的自由。
简而言之,如果你在做一些处理顺序很重要的事情,你就做错了。
在我看来,你好像在尝试做一个反馈循环,在这里你同时读取和写入帧缓冲区(通过绑定一个纹理并将同一个图像附加到一个FBO渲染目标)。
好吧,这是关于性能,而不是功能。
您可以假设您通常对CPU所做的假设:内存访问将被缓存。片段着色器进入的顺序无关紧要;它们中的一个将首先命中存储器,并且稍后命中它的那个该高速缓存中受益。
请记住:GPU是 * 优化 * 做这些东西。GPU销售的基础上如何快速纹理,着色器处理三角形渲染。实现知道如何纹理将被使用,你可以期待它不会愚蠢的排序它的输出片段。
如果你必须随机访问,那么你必须随机访问;你对此无能为力。但除此之外,你不应该浪费任何时间去担心或试图优化它。让硬件和驱动程序编写者做他们的工作吧。
gr8qqesn2#
回复@nicol-bolas的回复,因为我没有适当回复的声誉。
简而言之,如果你在做一些处理顺序很重要的事情,你就做错了。
某些算法依赖于这个顺序。滑动框过滤器(虽然只有在整数颜色存储时才可靠),它在任何窗口大小下都同样快,是一个非常值得注意的例子。其中2个将框变成三角形(双线性插值),3个生成很好的平滑二次曲线。
使用着色器中的条件,可以模拟算法的顺序性质,如下所示: