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

3

我在OpenGL ES中的场景需要几个大分辨率的纹理,但它们是灰度的,因为我只是用它们作为蒙版。我需要减少内存使用。

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

有没有办法将纹理加载到OpenGL中,并使其每像素少于16位?

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

谢谢!

3个回答

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
1
对于S3TC,您可以尝试使用libsquish。但是据我所知,Imagination Technologies和AMD仅提供Windows等平台的压缩库二进制文件。 - Kazuki Sakamoto
有没有办法从某些格式的压缩文件中提取尺寸和格式,或者我需要将其存储在元数据中? - EboMike
1
PVRTC通常与包含纹理元数据的PVR纹理格式一起使用。此外,PVR纹理格式是开放的,如果您需要支持S3Tc或ATITC格式,则非常有帮助。请参考PVRTexTool - Kazuki Sakamoto
注意:Thunderbolt(以及可能其他Adreno手机)使用GL_AMD_compressed_ATC来进行ATITC压缩。 - EboMike

2
使用基于Imagination Technologies(也称为PowerVR)的系统,您应该能够使用PVRTC 4bpp,甚至可能是2bpp PVRTC变体(具体取决于纹理和质量要求)。
此外,虽然我不确定Android系统中公开了什么,但PVRTextool列出了I8(即灰度8bpp)作为目标纹理格式,这将为您提供无损选项。

1

所有搭载 Android 2.2 及以上版本的 Android 设备都支持 ETC1 纹理压缩。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接