2013-09-26 32 views
0

我正在使用OpenGL 2.0與渲染器,離屏GLSurfaceView和一些着色器腳本(* .fsh和* .vsh)的此照片應用程序。使用OpenGL將着色器繪製到流中?

從Assets文件夾中加載着色器腳本,準備GL表面和上下文等等之後,我們終於調用了GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 4);,它工作得非常好,它生成了帶有效果的位圖。

OF COURSE的問題是內存限制和任何足夠大的位圖(不管設備如何,對於舊的Gingerbread和Nexus 10的非常大的圖像都不是那麼大),它會產生OutOfMemoryException。

我不是很瞭解OpenGL,我知道處理大量數據的方式是使用流,因此沒有必要將它全部保存在內存中。

所以問題是,有沒有辦法通過流應用openGl着色器/渲染器而不是內存位圖?如果是,任何指向鏈接或基本過程的指針?

+0

對於這個愚蠢的問題感到抱歉,我是OpenGl的初學者,你如何在屏幕之外繪製着色器?正如我從文檔中理解的,渲染到GLSurfaceView應該只有在它可見時才能成功。 – Nativ

回答

1

不完全確定你的意思是Stream但這裏有另一種解決方案。分割渲染成多個傳遞。富勒來說,如果你有一個512×512的紋理和相應的四紋理,但只能買得起上傳256×256,由於內存限制,請執行下列操作:

  • 分裂紋理分成4塊
  • 創建一個單一的,擬合紋理對象
  • 對於每個大塊
    • 上傳當前組塊到TEX對象數據存儲
    • 畫出四的1/4,例如左上和紋理相應

注意,上面的例子中假設一個512×512的紋理和屏幕尺寸。無論如何,我認爲你明白了。

顯然,這是通常的內存/性能折衷。通過使用更多的帶寬進行傳輸並進行更多渲染,規避了內存限制。

注意:我是一名桌面GL人員,我不太清楚GPU和其他GPU之間的內存分配情況,或者甚至有一些專用VRAM。我認爲你的GL資源數量有限,甚至比整個系統內存小。

+0

嗨。感謝您的意見。我的意思是一個InputStream,或者(更確切地說)FileInputStream。這是一個有趣的想法,我肯定會看看它。內存與用於整個Java VM的內存相同。 – Budius

+0

@Budius:如果您可以使用流類加載部分紋理,您可以直接從SD卡或內部存儲器直接加載一組圖像,並將其上傳到紋理對象。 – thokra

相關問題