2009-01-08 134 views
6

我將某個場景渲染爲紋理,然後我需要以某種簡單的方式處理該圖像。我現在要做的是使用glReadPixels()讀取紋理,然後在CPU上處理它。然而這太慢了,所以我正在考慮將處理轉移到GPU。GPU上的紋理圖像處理?

我能想到的最簡單的設置是顯示一個簡單的白色四邊形,它在正交投影中佔據整個視口,然後將圖像處理位作爲片段着色器寫入。這將允許處理的許多實例並行運行以及訪問處理所需的任何紋理像素。

這是一個可行的做法嗎?這種做法很普遍嗎? 有沒有更好的方法來做到這一點?

回答

2

是的,這是通常的做事方式。

  1. 將某些東西渲染爲紋理。
  2. 使用着色器繪製全屏四邊形,讀取該紋理並執行一些操作。

可以通過讀取一個像素並在片段着色器中輸出一個像素來完成簡單的效果(例如,灰度,色彩校正等)。通過從偏移位置讀取一個像素並輸出一個像素,可以完成更復雜的操作(例如旋轉圖案)。通過讀取多個像素可以完成更復雜的操作。

在某些情況下,需要多個臨時紋理。例如。高半徑模糊往往是這樣做的:

  1. 渲染成紋理。
  2. 將着色器渲染爲另一個(較小)紋理,並將每個輸出像素計算爲多個源像素的平均值。
  3. 使用這個較小的紋理渲染到另一個小紋理中,並使用着色器進行適當的高斯模糊處理。
  4. ...重複

在所有上述情況下,雖然,每個輸出像素應該是獨立於其他輸出像素。它可以使用更多的輸入像素。

無法很好映射的處理操作的示例是求和麪積表,其中每個輸出像素取決於輸入像素和相鄰輸出像素的值。不過,在GPU上可以做到這些(example pdf)。

2

是的,這是進行圖像處理的正常方法。如果您要爲每個像素設置顏色,四邊形的顏色並不重要。根據您的應用程序,您可能需要小心像素採樣問題(即確保您從源紋理上正確的像素採樣,而不是在兩個像素之間進行採樣)。