Android的OpenGL纹理压缩
我需要一些帮助来查找如何使用Android纹理压缩的信息(或示例)。 我现在有很多PNG,我需要减less他们占用的内存量。 我正在寻找PVR压缩,但我不知道如何在OpenGL中使用它。
有些人可能会指向正确的方向或提供一些例子,因为我找不到任何东西。
Android上主要支持四种纹理压缩types:
- ETC1(爱立信纹理压缩) 。 所有Android手机均支持此格式。 但是,它不支持alpha通道,所以只能用于不透明纹理。
- PVRTC(PowerVR纹理压缩) 。 支持具有PowerVR GPU的设备(Nexus S,Kindle Fire等)。
- ATITC(ATI纹理压缩) 。 用于Qualcomm的Adreno GPU(Nexus One等)的设备。
- S3TC(S3纹理压缩) 。 这种纹理压缩技术被用于NVIDIA芯片组集成设备(Motorola Xoom等)
更详细的信息在这里和这里 。
总之,如果你的纹理没有alpha,你可以使用ETC1。 如果他们确实有alpha,并且想要支持所有设备,则必须将其他三种types的纹理压缩并根据设备进行加载。
如何使用:
-
压缩你的PNG文件(你可以根据纹理types使用ETC-Pack , PVRTexTool , ATI Compressonator , Nvidia Texure 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); }
这是一个ol线程,所以我想用http://devtools.ericsson.com/etc上提供的信息来更新它。ETC2在Khronos标准OpenGL ES 3.0和OpenGL 4.3中是强制性的。
您不应该在Android上使用PVR压缩,因为这不适用于所有型号。 为了避免这种情况,您应该只使用ETC1(在所有GLES 2.0设备上强制执行),或者使用独立的纹理包来执行独立的GPU模式。 Android开发指南有一个辅助类来加载压缩格式。
你可以使用etcpack来做压缩。
请注意,你不会得到一个ETC1 alpha通道 – 你可以做一些奇特的片段着色技巧来解决这个问题,把alpha通道作为一个单独的纹理。
只是想指出etc1并不是所有的android设备都支持,与gergonzalez所说的相反
注意:大多数Android设备都支持ETC1格式,但不能保证可用。 要检查设备是否支持ETC1格式,请调用ETC1Util.isETC1Supported()方法。
https://developer.android.com/guide/topics/graphics/opengl.html#textures