【问题标题】:Efficient pixel shader sum of all pixels所有像素的高效像素着色器总和
【发布时间】:2011-02-26 00:31:27
【问题描述】:

如何使用 HSLS 像素着色器有效地计算图像中所有像素的总和?我对 Pixel Shader 2.0 感兴趣,我可以将其作为 WPF 着色器效果调用。

【问题讨论】:

  • 您所说的“所有像素的总和”是什么意思 - 它是所有 R/G/B 值的总和或不同的值?

标签: c# wpf hlsl pixels pixel-shader


【解决方案1】:

WPF 中的效果更适合产生视觉效果。听起来您想将它们用于不同类型的计算,为此您需要将图像结果视为数据,这将需要 RenderTargetBitmap 无论如何都可以在软件中完成。 您可能想看看这些专为 GPGPU 设计的项目。

Accelerator

Brahma

OpenTK 我不知道 OpenTK 中 OpenCL 绑定的状态。 DirectCompute 和 CUDA 等其他技术可能也值得一看。

【讨论】:

    【解决方案2】:

    有一个更简单的不使用着色器的解决方案:将图像加载为纹理,创建一个 mipmap 链并读回最后一个 mipmap(1x1 像素)的值。这个技巧在游戏中广泛用于计算,例如,场景的平均亮度(为了应用 HDR 色调映射)。如果您更看重简单性和效率而不是准确性,这将是一个绝妙的技巧。

    【讨论】:

    • 究竟如何从 WPF 中的图像创建 mipmap 链,这与应用像素着色器一样快?
    • 通过使用盒子过滤器将图像大小调整为 1x1。
    • 谢谢你。我的纹理有些退化(高精度数值 FFT),而使用三角形过滤器得到了非常好的结果(期望结果的正负 1%),这对我来说已经足够好了。不过,盒子过滤器已经过时了。
    【解决方案3】:

    假设您想对图像中的 r/g/b 通道值求和(并假设您可以破坏原始像素) - 这是我的部分解决方案:

    1. 每 10 个像素将计算 10 个相邻像素的平均颜色,并将此平均颜色放在图像上。
    2. 然后在 CPU 端对每 10 个像素求和
      Pix_Value*10

    在这种情况下,与仅在 CPU 端求和像素值相比,我们获得了大约 10 倍的加速。

    【讨论】:

    • 无需涉及CPU,一切都可以在GPU上完成。 “低效”并没有开始描述这种方法,它甚至没有考虑 CPU-GPU 通信的成本。 -1
    猜你喜欢
    • 2010-12-28
    • 2012-11-29
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多