着色器帧缓冲器回读

ron*_*nag 6 glsl hlsl pixel-shader fragment-shader

我想知道在较新的着色器模型中是否支持从目标帧缓冲区读回像素值.我认为这在绘图管道的后期(非可编程)阶段是完成的,这使我希望这个特性可能已被添加到可编程管道中.

我知道可以绘制到纹理绑定的帧缓冲区,然后将此纹理发送到着色器,我只是希望有一种更优雅的方式来实现相同的功能.

Chr*_*odd 5

正如安德鲁所指出的,帧缓冲区访问在逻辑上是与片段着色器分开的阶段,因此在片段着色器中读取帧缓冲区是不可能的。这样做的原因(回答安德鲁的问题)是性能和图形管道的排序要求的结合。根据渲染管道的定义方式,帧缓冲区混合操作必须按照与进入管道开头的三角形/图元相同的顺序进行。另一方面,片段着色器可以按任何顺序发生。因此,通过让它们成为单独的阶段,GPU 可以在它们的输入可用时尽可能快地运行片段着色器,而无需在它们之间进行同步。只要它保持足够的缓冲区空间来保存片段着色器的输出,以便它们可以累积并允许帧缓冲区混合和写入按顺序发生,一切都很好,因为任何给定片段着色器的结果都是直到混合阶段之后才可见。

如果片段着色器有办法读取帧缓冲区,则需要某种同步来确保这些读取按顺序发生,从而大大减慢速度。