我在 OpenGL ES 中的场景需要多个高分辨率纹理,但它们是灰度的,因为我仅将它们用于 mask 。我需要减少内存使用。
我尝试使用 Bitmap.Config.ALPHA_8 和 RGB_565 加载这些纹理。 ALPHA_8 似乎实际上增加了内存使用。
是否有某种方法可以将纹理加载到 OpenGL 中并使其使用每像素少于 16 位?
glCompressedTexImage2D 看起来很有前途,但据我所知,不同的手机提供不同的纹理压缩方法。另外,我不知道压缩是否真的减少了运行时的内存使用。以 ATITC 和 PVRTC 格式存储我的纹理的解决方案是什么?如果是这样,我如何检测设备支持哪种格式?
谢谢!
最佳答案
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 中使用纹理格式指定支持的设备。
编辑:
关于android - 减少 OpenGL ES 1.1 中纹理的内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5240293/