减少OpenGL ES 1.1中纹理的内存使用

时间:2011-03-09 01:07:34

标签: android opengl-es

我在OpenGL ES中的场景需要几个大分辨率纹理,但它们是灰度的,因为我只是将它们用于遮罩。我需要减少我的记忆力。

我尝试使用Bitmap.Config.ALPHA_8和RGB_565加载这些纹理。 ALPHA_8似乎实际上增加了内存使用。

是否有某种方法可以将纹理加载到OpenGL中并使其每像素使用少于16位?

glCompressedTexImage2D看起来很有希望,但据我所知,不同的手机提供不同的纹理压缩方法。此外,我不知道压缩是否实际上减少了运行时的内存使用。解决方案是以ATITC和PVRTC格式存储我的纹理吗?如果是这样,我如何检测设备支持哪种格式?

谢谢!

3 个答案:

答案 0 :(得分: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 :(得分:2)

使用基于Imagination Technologies(又名PowerVR)的系统,您应该能够使用PVRTC 4bpp和(取决于纹理和质量要求)甚至2bpp PVRTC变体。

此外,虽然我不确定在Android系统中暴露了什么,但PVRTextool将I8(即灰度8bpp)列为目标纹理格式,这将为您提供无损选项。

答案 2 :(得分:1)

Android 2.2及更高版本的所有Android设备均支持ETC1纹理压缩。