我需要帮助查找有关如何在Android上使用纹理压缩的信息(或示例)。目前我有许多PNG文件需要减少它们占用的内存。我正在研究PVR压缩,但是我无法弄清楚如何在OpenGL中使用它。
请问是否有人能够指点迷津或提供一些示例?因为我现在找不到相关资料。
Android主要支持四种纹理压缩类型:
简而言之,如果您的纹理没有alpha通道,可以使用ETC1。如果它们具有alpha通道,并且您想要支持所有设备,则必须将纹理压缩为另外三种类型,并根据设备加载它们。
如何使用:
压缩PNG文件(您可以使用像ETC-Pack,PVRTexTool,ATI Compressonator,Nvidia Texture Tools等工具),并将其添加到项目资产中。
确定设备中可用的扩展名,如果未使用ETC1:
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
String s = gl.glGetString(GL10.GL_EXTENSIONS);
if (s.contains("GL_IMG_texture_compression_pvrtc")){
//Use PVR compressed textures
}else if (s.contains("GL_AMD_compressed_ATC_texture") ||
s.contains("GL_ATI_texture_compression_atitc")){
//Load ATI Textures
}else if (s.contains("GL_OES_texture_compression_S3TC") ||
s.contains("GL_EXT_texture_compression_s3tc")){
//Use DTX Textures
}else{
//Handle no texture compression founded.
}
}
以原始数据形式加载压缩纹理。
使用 glCompressedTexImage2D 代替 glTexImage2D:
public void onDrawFrame(GL10 gl) {
....
gl.glCompressedTexImage2D(GL10.GL_TEXTURE_2D, level, internalformat, width,
height, border, imageSize, data);
}
这是一个旧的线程,我想更新一下其中提到的信息,它可以在http://devtools.ericsson.com/etc上找到。 ETC2在Khronos标准的OpenGL ES 3.0和OpenGL 4.3中是强制性的。
我想指出,与 gergonzalez所说的相反,不是所有Android设备都支持etc1。
注意:大多数Android设备支持ETC1格式,但不能保证其可用。要检查设备是否支持ETC1格式,请调用ETC1Util.isETC1Supported()方法。
https://developer.android.com/guide/topics/graphics/opengl.html#textures