Directx ComputeShader与PixelShader的速度

Directx ComputeShader与PixelShader的速度,directx,pixel-shader,compute-shader,Directx,Pixel Shader,Compute Shader,我有一个关于ComputeShader和PixelShader比较的问题。 我想在缓冲区上做一些处理,这在像素着色器和计算着色器中都是可能的,现在我想知道这两者是否比另一个有任何优势,特别是在速度方面。我曾经遇到过这样的问题:要么仅仅使用8位值,但我应该能够解决这个问题 输出中的每个数据点都将通过使用其周围的总共8个数据点(MxN矩阵)来计算,因此我认为这对于像素着色器来说是完美的,因为不同的输出根本不会相互影响 但我无法找到任何基准来比较着色器,现在我想知道我应该瞄准哪一个。唯一的目标是速度。

我有一个关于ComputeShader和PixelShader比较的问题。 我想在缓冲区上做一些处理,这在像素着色器和计算着色器中都是可能的,现在我想知道这两者是否比另一个有任何优势,特别是在速度方面。我曾经遇到过这样的问题:要么仅仅使用8位值,但我应该能够解决这个问题

输出中的每个数据点都将通过使用其周围的总共8个数据点(MxN矩阵)来计算,因此我认为这对于像素着色器来说是完美的,因为不同的输出根本不会相互影响

但我无法找到任何基准来比较着色器,现在我想知道我应该瞄准哪一个。唯一的目标是速度。

据我所知,着色器是着色器,从某种意义上说,它们只是由大量线程在数据上运行的程序。因此,与计算着色器相比,在像素着色器中进行计算时,通常在计算能力/速度方面不应有任何差异。然而

要在pixelshader上进行计算,您必须对数据进行按摩,使其看起来像图像数据,这意味着您必须首先绘制一个四边形,而且您的输出必须具有像素的“形状”(基本上为float4)。然后,应用程序必须将这些数据解释为有用的内容

如果您使用computeshader,您可以完全控制要使用的线程数量,而对于像素着色器,它们必须是有效的分辨率。此外,您还可以以您喜欢的任何格式输入和输出数据,并利用无人机的加速转换(我认为)


我建议使用ComputeShader,因为它们非常适合做一般用途的计算,而且更容易使用。您的整体应用程序可能也会更快,即使实际着色器计算时间大致相同,只是因为你可以避免一些困难,你必须跳过这些困难才能让像素着色器完成你想要的工作。

你通常也可以至少有8个输出缓冲区,这样每个像素就有32字节的可能输出数据。然后您可以将它们写为“out vec4 out0;out vec4 out1;等等”。然后创建多个缓冲区,并将每个缓冲区分配给GL_颜色_附件,其中X是缓冲区编号。在着色器中写入它们之后,可以通过执行glReadBuffer(GL_COLOR_ATTACHMENT)然后执行glReadPixels来读取它们,以从特定缓冲区中获取数据。您可以通过查询glGetIntegerv(GL_MAX_DRAW_buffers,&maxDrawBuf)来查看可以拥有多少输出缓冲区。。