我在OpenGL ES中的场景需要几个大分辨率纹理,但它们是灰度的,因为我只是将它们用于遮罩。我需要减少我的记忆力。
我尝试使用Bitmap.Config.ALPHA_8和RGB_565加载这些纹理。 ALPHA_8似乎实际上增加了内存使用。
是否有某种方法可以将纹理加载到OpenGL中并使其每像素使用少于16位?
glCompressedTexImage2D看起来很有希望,但据我所知,不同的手机提供不同的纹理压缩方法。此外,我不知道压缩是否实际上减少了运行时的内存使用。解决方案是以ATITC和PVRTC格式存储我的纹理吗?如果是这样,我如何检测设备支持哪种格式?
谢谢!
答案 0 :(得分:10)
例如(抱歉在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纹理压缩。