2012-10-02 131 views
12

我正在製作相機應用程序,此應用程序將爲用戶提供一些過濾器。目前我的代碼是在NDK上,它工作正常,但是我想讓它更快一點。看來GPU和opengl ES 2.0是走的路。我唯一關心的是GPU的內存限制。由於現代相機需要5-10mp的圖像,而GPU內存的限制遠小於此。我想知道是否有辦法解決這個限制。在我看來,唯一合乎邏輯的選擇是將圖像分成小部分,然後在GPU上處理它們,最後將它們拼湊成最終圖像。我的問題是,如果這種方法仍然有利於性能,並且還有其他選擇,可以在移動GPU上對高分辨率圖像進行圖像處理。如何在GPU上處理GPU高分辨率圖像處理的內存限制?

編輯:我需要澄清一點,我想使用GPU進行圖像處理,所以我的目標不是渲染結果到屏幕。我將渲染到另一個紋理並將其保存到磁盤。

+1

這真的取決於你在做什麼。 GPU提供的優勢在於它們高度平行,但並不是所有問題都可以通過向其中投入更多內核來簡化。 – thecoshman

+0

我想得到一個普遍的問題的一般解決方案,但是目前我正在嘗試編寫「拉普拉斯金字塔」,它在CPU上完成時代價非常昂貴。 – dirhem

+0

好吧,如果您正在爲圖像應用色調,您希望將相同的操作應用於所有位,那麼加載到GPU是一個明顯的解決方案。模糊圖像等任務有點棘手,因爲每個像素的新值取決於像素範圍。但就你而言,你必須考慮硬件之間存在很多差異,例如他們支持多少內存,紋理有多大,可以發送給他們多少數據。他們甚至可能無法執行OpenCL樣式處理 – thecoshman

回答

2

自從任天堂娛樂系統在理光2A03頻率爲1.79 MHz以來,你的拼貼想法已被使用,所以這是一個很好的方法。谷歌使用平鋪來管理地圖顯示,甚至像「孤島危機」這樣的遊戲往往會將其大部分紋理的紋理尺寸限制爲諸如1024x1024(1兆像素)之類的東西。而且,1000萬像素需要30兆內存,所以有些設備可能會出現問題,尤其是因爲如果使用源和目標紋理,則需要60兆內存。

請記住紋理大小傾向於使用2的冪(2,4,8,16,32,64等)。至少如果你把它切碎並平鋪圖像,你有時會獲得更好的質量。

2

您不需要將實時過濾器應用到10mp圖像中...... 因爲沒有這樣的顯示器(或者可能沒有這種顯示器,但我們之間沒有流行使用)。 :)

因此,您只需要對正在顯示的像素應用濾鏡(1900x1280?)。 你提到的平鋪技術在某些場景下仍然可以使用。延遲渲染就是這樣一個例子。 X-Box 360每天都使用這兩種技術(平鋪和延期)。由於對延遲技術的高內存要求,沒有平鋪是不可能的。

+0

我編輯了這個問題,以澄清我不會使用GPU將圖像渲染到屏幕上。我與屏幕及其分辨率完全無關。圖像處理將在後臺完成,屏幕將只顯示進度條。所以GPU內存限制仍然存在。 – dirhem