我正在使用GLSL进行一些图像处理工作,因此绘制全屏四边形并在片段着色器中进行处理。我想知道我们是否可以期望以任何特定的优先顺序处理片段?
我知道片段是并行处理的,我们不能对任何特定片段的完成时间做出任何保证,那么如何处理呢?这只是一个大排队吗?那个模式会是什么样子,即。扫描线,块等。
这会依赖于驱动程序吗?你可以告诉我在这个领域有几个问题,而我在找到它的文档时遇到了麻烦。
答案 0 :(得分:1)
没有任何文档,因为它是任意处理的。硬件具有以完全任意顺序处理片段的能力;您不能以任何方式,形状或形式了解片段处理的顺序。没有控件可以更改片段处理的顺序,影响该顺序,甚至根本不检测它。
好吧,直到4.2和ARB_shader_image_load_store。但即便如此,内置控件也可以让硬件尽可能自由。
简而言之,如果你正在做一些处理顺序很重要的事情,你就会做错事。
听起来像你正在尝试做一个反馈循环,你可以同时读取和写入帧缓冲区(通过绑定纹理并将相同的图像附加到FBO渲染目标)。这是不允许的。
好的,这是关于性能,而不是功能。
您可以假设您通常会对CPU执行的操作:将缓存内存访问。片段着色器进入的顺序无关紧要;其中一个将首先击中内存,之后点击它的那个将从缓存中受益。
请记住:GPU已经优化来执行此操作。 GPU基于纹理,着色器处理三角形的渲染速度来销售。实现知道如何使用纹理,你可以预期它对它输出的片段的排序方式不会很愚蠢。
如果你必须随机访问,那么你必须随机访问;你无能为力。但除此之外,这不是你应该浪费任何时间来担心或试图优化的东西。让硬件和驱动程序编写者完成他们的工作。