高效的像素着色器求所有像素之和

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

你说的“所有像素的总和”是指所有R/G/B值的总和还是其他什么? - Agnius Vasiliauskas
3个回答

7

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


你如何在WPF中创建一个mipmap链,使其与应用像素着色器一样快? - luvieere
通过使用盒式滤波器将图像调整大小为1x1。 - The Fiddler
谢谢您。我的纹理有些退化(高精度数值FFT),使用三角形滤波器取而代之,得到了非常好的结果(与期望结果相差不到1%),这对我来说已经足够好了。然而,盒状滤波器的结果偏差很大。 - Thomas

3
假设您想在图像中对r/g/b通道值进行求和(并且假设您可以破坏原始像素),这是我的部分解决方案:
  1. 每10个像素将计算10个相邻像素的平均颜色,并将此平均颜色放置在图像上。
  2. 然后在CPU端对每10个像素的
    Pix_Value*10
    之和进行求和。
这样,与仅在CPU端对像素值进行求和相比,我们可以获得约10倍的加速。

不需要涉及CPU,所有的计算都可以在GPU上完成。“低效”甚至不能描述这种方法,它甚至没有考虑到CPU-GPU通信的成本。-1 - Thomas

-1

WPF中的效果更适合产生视觉效果。听起来你想将它们用于不同类型的计算,为此你需要将图像结果视为数据,这需要使用RenderTargetBitmap,在软件中完成。

你可能想看看这些专为GPGPU设计的项目。

Accelerator

Brahma

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接