2010-05-31 80 views
6

如何通過使用HSLS像素着色器來高效地計算圖像中所有像素的總和?我對Pixel Shader 2.0感興趣,我可以將其作爲WPF着色器效果調用。所有像素的高效像素着色器總和

+0

你的意思是'所有像素的總和' - 它是所有R/G/B值的總和還是不同的? – 2010-09-01 07:38:02

回答

-1

WPF中的效果更適合產生視覺效果。這聽起來像你想要使用它們進行不同類型的計算,要做到這一點,你需要將圖像結果作爲數據處理,這需要RenderTargetBitmap,而後者將在軟件中完成。 你可能想看看這些爲GPGPU設計的項目。

Accelerator

Brahma

OpenTK我不知道在OpenTK OpenCL的綁定狀態。其他技術如DirectCompute和CUDA也值得一看。

6

有一個更簡單的解決方案,不使用着色器:將圖像加載爲紋理,創建mipmap鏈並讀回最後一個mipmap(1x1像素)的值。這個技巧廣泛用於計算場景的平均亮度(以便應用HDR色調映射)。如果您重視簡單性和效率而不是精確度,這是一個很棒的竅門

+0

您究竟如何從WPF中的圖像創建mipmap鏈,這與應用像素着色器一樣快? – luvieere 2010-07-15 15:38:14

+0

通過使用框過濾器將圖像的大小調整爲1x1。 – 2010-07-15 22:41:34

+0

謝謝你。我的紋理有些退化(高精度數字FFT),並且使用三角形濾波器取而代之的是非常好的結果(加或減1%的結果),這對我來說已經足夠了。儘管如此,盒式過濾器還是不錯的。 – Thomas 2013-10-05 12:09:33

3

假設要在圖像總結R/G/B的信道值(並假設可以破壞原始像素) - 這是我的部分解決方案:

  1. 每個第十像素將計算的平均色10個相鄰像素,並將這個平均顏色放在圖像上。
  2. 然後在每個第10個像素的CPU端總和
    Pix_Value*10

在這種情況下,與僅在CPU側求和像素值相比,我們獲得了大約10倍的加速。

+0

這是一個不錯的選擇,+1 – luvieere 2010-09-01 17:09:12

+0

無需涉及CPU,一切都可以在GPU上完成。 「低效率」並沒有開始描述這種方法,它甚至不考慮CPU-GPU通信的成本。 -1 – Thomas 2013-10-08 08:18:28