2011-03-09 53 views
3

我在OpenGL ES中的場景需要幾個大的分辨率紋理,但它們都是灰度,因爲我只是將它們用於蒙版。我需要減少我的記憶使用。在OpenGL ES 1.1中減少紋理的內存使用

我試着用Bitmap.Config.ALPHA_8和RGB_565加載這些紋理。 ALPHA_8似乎實際上增加了內存的使用。

是否有某種方法可以將紋理加載到OpenGL中並使其每像素使用少於16位?

glCompressedTexImage2D看起來可能很有前景,但從我所知道的情況來看,不同的手機提供了不同的紋理壓縮方法。另外,我不知道壓縮是否真的減少了運行時的內存使用。是否將解決方案存儲爲ATITC和PVRTC格式的紋理?如果是這樣,我如何檢測設備支持哪種格式?

謝謝!

回答

10

PVRTC,ATITC,S3TC等GPU原生壓縮紋理應該減少內存使用量並提高渲染性能。

例如(不好意思在C,可以實現它在Java中使用GL11.glGetString),

const char *extensions = glGetString(GL_EXTENSIONS); 
int isPVRTCsupported = strstr(extensions, "GL_IMG_texture_compression_pvrtc") != 0; 
int isATITCsupported = strstr(extensions, "GL_ATI_texture_compression_atitc") != 0; 
int isS3TCsupported = strstr(extensions, "GL_EXT_texture_compression_s3tc") != 0; 

if (isPVRTCsupportd) { 
    /* load PVRTC texture using glCompressedTexImage2D */ 
} else if (isATITCsupported) { 
... 

除此之外,您還可以指定使用的紋理格式在AndroidManifest.xml支持的設備。

編輯

+1

有沒有一種方法可以在運行時加載位圖並對其進行壓縮,因此我不必擁有不同格式圖像的多個副本?我找不到有關ATITC格式的任何文檔。 – Tenfour04 2011-03-09 11:49:41

+1

對於S3TC,您可以使用[libsquish](http://code.google.com/p/libsquish/)。但是,AFAIK,Imagination Technologies和AMD僅爲windows等提供了壓縮庫二進制文件。 – 2011-03-09 12:36:59

+0

有沒有一種方法可以從這些格式之一中壓縮的文件中提取維度和格式,還是需要將其存儲在我的元數據中? – EboMike 2011-03-16 08:16:43

2

採用Imagination Technologies公司爲基礎的(又名的PowerVR)系統,你應該能夠使用PVRTC 4bpp和(取決於質地和質量要求)可能甚至是2bpp PVRTC變種。

此外,雖然我不確定Android系統中曝光的內容,但PVRTextool列出了I8(即灰度8bpp)作爲目標紋理格式,這會爲您提供無損選項。

1

Android 2.2及更高版本的所有Android設備都支持ETC1紋理壓縮。