2014-09-05 170 views
0

我目前在Android和OpenGL ES 2.0上玩NDK。我想知道是否以及如何可能加載OpenGl紋理垃圾,所以我可以避免在將應用程序堆中的整個未壓縮紋理賦予OpenGl之前。所以,我想要做的事情(簡單化)是從存儲器讀取512Kb到RAM中,然後將這些512kb轉移到OpenGl,然後將下一個512kb加載到RAM中,等等 - 因此紋理加載的內存佔用空間應該總是在512KB。然而,我在OpenGL的所有例子中看到,人們傾向於將整體未壓縮的圖像數據加載到RAM中(對於4096x4096x32位的紋理,爲64MB)然後將整個數據立即複製到OpenGl,只有64MB的內存佔用高峯用於加載紋理!!: - 我想知道甚至更多,因爲用Dalvik VM運行的java中編寫的應用程序通常只有16Mb的可用堆內存 - 所以他們如何設法將紋理加載到OpenGL的?我失去了一些東西基本在這裏嗎?OpenGl ES 2.0加載紋理junkwise

非常感謝和問候 塞繆爾

+0

自2009年以來,應用程序並未擁有16MB託管堆限制。儘管如此,64MB是移動設備上單個紋理的相當大量的數據,使用壓縮紋理格式會更好。 – fadden 2014-09-05 15:34:19

回答

0

是,紋理可以在帆船裝載。

wa行ay要做到這一點,首先調用glTexImage2D()全尺寸,最後一個參數的空指針,否則你會傳遞一個指向數據的指針。這指定紋理的大小和格式,但不填充數據。

之後,可以使用glTexSubImage2D()來填充具有數據塊的紋理。

例如,填補了4096×4096 RGBA紋理1024×1024大小的塊:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4096, 4096, 0, 
      GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1024, 1024, 
       GL_RGBA, GL_UNSIGNED_BYTE, data00); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 1024, 0, 1024, 1024, 
       GL_RGBA, GL_UNSIGNED_BYTE, data01); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 2048, 0, 1024, 1024, 
       GL_RGBA, GL_UNSIGNED_BYTE, data02); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 3072, 0, 1024, 1024, 
       GL_RGBA, GL_UNSIGNED_BYTE, data03); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 1024, 1024, 1024, 
       GL_RGBA, GL_UNSIGNED_BYTE, data10); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 1024, 1024, 1024, 1024, 
       GL_RGBA, GL_UNSIGNED_BYTE, data11); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 2048, 1024, 1024, 1024, 
       GL_RGBA, GL_UNSIGNED_BYTE, data12); 
... 

如果你真的需要這樣的紋理大,你可能要考慮使用壓縮紋理。不幸的是,支持特定的壓縮紋理格式的設備依賴於ES 2.0。但考慮到它可以減少內存使用量,並可能提高性能/功耗,它可能仍值得研究。查看glCompressedTexImage2D()的起點。

當然,您還要確保您的資產不會高於需要的分辨率。