Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Glsl 着色器帧缓冲区回读_Glsl_Hlsl_Pixel Shader_Fragment Shader - Fatal编程技术网

Glsl 着色器帧缓冲区回读

Glsl 着色器帧缓冲区回读,glsl,hlsl,pixel-shader,fragment-shader,Glsl,Hlsl,Pixel Shader,Fragment Shader,我想知道新的着色器模型是否支持从目标帧缓冲区读回像素值。我假设这是在绘图管道的后期(不可编程)阶段完成的,这使我希望这个功能可能已经添加到可编程管道中 我知道可以绘制到纹理绑定帧缓冲区,然后将该纹理发送到着色器,我只是希望有一种更优雅的方式来实现相同的功能。不。正如您所提到的,渲染到纹理是实现该功能的方式 如果您查看GPU管道的框图,您将看到混合阶段(将片段着色器输出与帧缓冲区相结合的阶段)与片段着色器分离,并且是固定功能 我不是GPU设计师,所以我只能推测原因。大概是为了保持帧缓冲区访问速度,

我想知道新的着色器模型是否支持从目标帧缓冲区读回像素值。我假设这是在绘图管道的后期(不可编程)阶段完成的,这使我希望这个功能可能已经添加到可编程管道中


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

不。正如您所提到的,渲染到纹理是实现该功能的方式

如果您查看GPU管道的框图,您将看到混合阶段(将片段着色器输出与帧缓冲区相结合的阶段)与片段着色器分离,并且是固定功能

我不是GPU设计师,所以我只能推测原因。大概是为了保持帧缓冲区访问速度,并将片段着色器阶段与帧缓冲区隔离,以便更好地并行化。可能还有关于多重抽样的问题,等等


(更不用说固定函数混合在大多数情况下“足够好了”)

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


如果碎片着色器有办法读取帧缓冲区,则需要某种形式的同步,以确保这些读取按顺序进行,从而大大降低速度。

实际上,我认为这在Direct3D 11 SM 5.0中是可行的(尽管我没有测试它)

您可以将UAV绑定到PS 5.0,以允许使用方法
OMSEtrenderTargets和UnorderedAccessView对其进行读写操作

在这种情况下,渲染的交换链的backbuffer必须使用flag
DXGI\u USAGE\u UNORDERED\u ACCESS
(我猜)


这在DXSDK OIT11示例中使用。

您可以绘制纹理纹理纹理(使用渲染目标视图),然后将其作为输入绑定到另一个着色器(使用着色器资源视图)。TEX然后是一个psedou帧缓冲区。

可以使用shader\u framebuffer\u fetch扩展在片段着色器中读回帧缓冲区的内容。该支持可以添加到GPU中,但会造成一些性能损失。事实上,这些天来,我正致力于在消费类电子产品市场上一个知名GPU品牌的OpenGL ES2.0驱动程序中添加对该扩展的支持