2011-03-04 79 views
1

我有一个关于ComputeShader与PixelShader相比的问题。 我想在缓冲区上做一些处理,并且这对像素着色器和计算着色器都是可能的,现在我想知道在另一个中是否有任何优势,特别是在速度方面。我遇到了只使用8位值的问题,但我应该可以解决这个问题。ComputeShader与PixelShader的速度

输出中的每个数据点将通过使用它周围的总共8个数据点(MxN矩阵)进行计算,所以我认为这对于像素着色器来说是完美的,因为不同的输出不会影响每个其他所有。

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

回答

2

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

要做到对你按摩你的数据,因此它看起来像图像数据pixelshader计算,这意味着你必须首先的画四,而且,你的输出必须有'像素的形状(基本上是float4)。这些数据必须由您的应用程序解释为有用的东西

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

我建议使用computeshaders,因为他们是做普通用途计算,很容易与。即使实际的着色器计算时间大致相同,您的整个应用程序也可能会更快,仅仅是因为您可以避免一些必须跳过的环节,才能让像素着色器按照您的要求进行操作。

+1

您通常还可以有至少8个输出缓冲区,以便为每个像素提供32个字节的可能输出数据。然后你可以把它们写成“out vec4 out0; out vec4 out1;等等......”。然后创建多个缓冲区并将其分配给GL_COLOR_ATTACHMENT ,其中X是缓冲区号。在着色器中写入之后,可以通过执行glReadBuffer(GL_COLOR_ATTACHMENT ),然后使用glReadPixels从特定缓冲区中获取数据来读出它们。您可以通过查询glGetIntegerv(GL_MAX_DRAW_BUFFERS,&maxDrawBuf)来查看可以输出多少个缓冲区。 – Martin 2018-01-02 02:40:49