所有像素的高效像素着色器总和

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

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

假设您想要在图像中求和r / g / b通道值(并假设您可以销毁原始像素) – 这是我的部分解决方案:

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

    每个第10个像素。

在这种情况下,与仅在CPU侧汇总像素值相比,我们可以获得大约10倍的加速。

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

加速器

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