2015-12-23 31 views
0

當加載在Android OpenGL的紋理數據,用差,以應付在座標的Android和OpenGL之間系統我看到的典型的圖案是在上傳之前翻轉位圖:不幸的是加載並翻轉Android位圖作爲OpenGL紋理時避免加倍內存?

Bitmap original = BitmapFactory.decodeStream(...); 
Matrix flip = new Matrix(); 
flip.postScale(1f, -1f); 
Bitmap toUpload = Bitmap.createBitmap(original, ..., flip, true); 
original.recyle(); 

對於短暫的時間量這些位圖所需的內存翻倍,因爲原始版本和翻轉版本都是駐留的。這對於非常大的圖像如紋理圖集是有問題的。

有沒有一種巧妙的方法來避免這種加倍?例如,在原處操作原稿,還是在單個步驟中加載和轉換?當然,我總是可以操作源數據(即,預先翻轉圖像)或紋理映射(即,反轉V座標),但是我希望在圖像加載期間解決這個問題作爲分離問題的一種方式。

+0

我不知道你使用'Bitmap'類,但assuiming它允許對圖像數據的隨機訪問,你當然可以翻轉數據就地 - 如果你想在同一時間,一個字節。另一種選擇是使用'glTexSubImage2D'分別上傳每個圖像行。 – derhass

+0

是的,真的,手動操縱總是一種選擇。我擔心這可能太慢而不可行,但我必須通過實驗做出決定。 – errcw

回答

1

作爲一個極端的例子,隨着移動VR工作,圖像和視頻源的含量通常是在一些任意格式,這取決於使用什麼工具來生產它。

VR內容是如此之大,將所述圖像的像素(像翻轉)是不實際的。將變換插入到GL管道中效率更高。

將3D對象的頂點和UV映射,就像你說的不保持關注一個乾淨的分離,但它是迄今爲止解決圖像格式問題的最佳方式。是的,它可能會難以將自定義轉換插入管道中。

當然,如果你有選擇,圖像可以預轉化在編輯器,專爲您的應用程序,讓您的管道非常乾淨。