Android OpenGL纹理压缩



我需要一些帮助来查找如何在Android中使用纹理压缩的信息(或示例)。我现在有很多PNG,我需要减少它们占用的内存量。我在研究PVR压缩,但我不知道如何在OpenGL中使用它。

有人能为我指明正确的方向吗?或者提供一些例子,因为我什么都找不到。

Android上主要支持四种纹理压缩类型:

  • ETC1(Ericsson纹理压缩)。所有安卓手机都支持这种格式。但是,它不支持alpha通道,因此只能用于不透明纹理
  • PVRTC(PowerVR纹理压缩)。支持带有PowerVR GPU的设备(Nexus S、Kindle fire等)
  • ATITC(ATI纹理压缩)。用于高通公司的Adreno GPU设备(Nexus One等)
  • S3TC(S3纹理压缩)。这种纹理压缩用于NVIDIA芯片组集成设备(Motorola Xoom等)

这里和这里有更详细的信息。

简而言之,如果你的纹理没有alpha,你可以使用ETC1。如果它们确实有alpha,并且您希望支持所有设备,则必须将纹理压缩为其他三种类型,并根据设备加载它们。

如何使用:

  1. 压缩您的png文件(您可以根据纹理类型使用ETC Pack、PVRTexTool、ATI Compressonator、Nvidia Texure Tools等工具)并添加到您的项目资产中。

  2. 如果您没有使用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.               
         }
    }           
    
  3. 将压缩纹理作为原始数据加载。

  4. 使用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/etcETC2在Khronos标准OpenGL ES 3.0和OpenGL 4.3中是强制性的。

您不应该在Android上只使用PVR压缩,因为这不适用于所有型号。为了避免这种情况,您应该只使用ETC1(在所有GLES 2.0设备上强制要求使用),或者为单独的GPU模式提供单独的纹理包。android开发指南有一个助手类来加载压缩格式。

你可以使用etcpack进行压缩。

请注意,使用ETC1不会获得alpha通道-您可以通过将alpha通道作为一个单独的纹理来实现一些奇特的片段着色技巧。

我只是想指出etc1并不是所有安卓设备都支持的,这与gergonzalez所说的相反

注意:大多数安卓设备都支持ETC1格式,但不能保证它可用。要检查设备上是否支持ETC1格式,请调用ETC1Til.isTEC1Supported()方法。

https://developer.android.com/guide/topics/graphics/opengl.html#textures

最新更新