我將某個場景渲染爲紋理,然後我需要以某種簡單的方式處理該圖像。我現在要做的是使用glReadPixels()
讀取紋理,然後在CPU上處理它。然而這太慢了,所以我正在考慮將處理轉移到GPU。GPU上的紋理圖像處理?
我能想到的最簡單的設置是顯示一個簡單的白色四邊形,它在正交投影中佔據整個視口,然後將圖像處理位作爲片段着色器寫入。這將允許處理的許多實例並行運行以及訪問處理所需的任何紋理像素。
這是一個可行的做法嗎?這種做法很普遍嗎? 有沒有更好的方法來做到這一點?
我將某個場景渲染爲紋理,然後我需要以某種簡單的方式處理該圖像。我現在要做的是使用glReadPixels()
讀取紋理,然後在CPU上處理它。然而這太慢了,所以我正在考慮將處理轉移到GPU。GPU上的紋理圖像處理?
我能想到的最簡單的設置是顯示一個簡單的白色四邊形,它在正交投影中佔據整個視口,然後將圖像處理位作爲片段着色器寫入。這將允許處理的許多實例並行運行以及訪問處理所需的任何紋理像素。
這是一個可行的做法嗎?這種做法很普遍嗎? 有沒有更好的方法來做到這一點?
是的,這是通常的做事方式。
可以通過讀取一個像素並在片段着色器中輸出一個像素來完成簡單的效果(例如,灰度,色彩校正等)。通過從偏移位置讀取一個像素並輸出一個像素,可以完成更復雜的操作(例如旋轉圖案)。通過讀取多個像素可以完成更復雜的操作。
在某些情況下,需要多個臨時紋理。例如。高半徑模糊往往是這樣做的:
在所有上述情況下,雖然,每個輸出像素應該是獨立於其他輸出像素。它可以使用更多的輸入像素。
無法很好映射的處理操作的示例是求和麪積表,其中每個輸出像素取決於輸入像素和相鄰輸出像素的值。不過,在GPU上可以做到這些(example pdf)。
是的,這是進行圖像處理的正常方法。如果您要爲每個像素設置顏色,四邊形的顏色並不重要。根據您的應用程序,您可能需要小心像素採樣問題(即確保您從源紋理上正確的像素採樣,而不是在兩個像素之間進行採樣)。