【问题标题】:Speed of ComputeShader vs. PixelShaderComputeShader 与 PixelShader 的速度
【发布时间】:2011-03-04 14:45:25
【问题描述】:

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

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

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

【问题讨论】:

    标签: directx pixel-shader compute-shader


    【解决方案1】:

    据我了解,着色器是着色器,因为它们只是由大量线程在数据上运行的程序。因此,一般而言,在像素着色器与计算着色器中进行计算的计算能力/速度不应有任何差异。 然而..

    要对像素着色器进行计算,您必须对数据进行处理,使其看起来像图像数据,这意味着您必须首先绘制一个四边形,而且您的输出必须具有像素的“形状”(基本上是float4)。然后,您的应用必须将这些数据解释为有用的东西

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

    我建议使用计算着色器,因为它们用于进行通用计算并且更容易使用。即使实际的着色器计算时间大致相同,您的整个应用程序也可能会更快,这只是因为您可以避免一些您必须跳过的圈子才能让像素着色器做您想做的事情。

    【讨论】:

    • 您通常还可以拥有至少 8 个输出缓冲区,这样每个像素可以提供 32 字节的可能输出数据。然后你可以把它们写成“out vec4 out0; out vec4 out1; etc...”。然后创建多个缓冲区并将每个缓冲区分配给 GL_COLOR_ATTACHMENT 其中 X 是缓冲区编号。在着色器中写入它们后,您可以通过执行 glReadBuffer(GL_COLOR_ATTACHMENT) 读取它们,然后执行 glReadPixels 以从特定缓冲区中获取数据。您可以通过查询 glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuf).. 来查看可以拥有多少个输出缓冲区。
    猜你喜欢
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 2019-02-15
    • 2014-07-02
    相关资源
    最近更新 更多