Android OpenGL纹理压缩

Chr*_*ris 55 android textures opengl-es

我需要一些帮助来查找如何使用Android纹理压缩的信息(或示例).我现在有很多PNG,我需要减少他们占用的内存量.我在看PVR压缩,但我无法弄清楚如何在OpenGL中使用它.

有些人可能指出我正确的方向或提供一些例子,因为我找不到任何东西.

ger*_*lez 84

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

  • ETC1(爱立信纹理压缩).所有Android手机均支持此格式.但是,它不支持alpha通道,因此只能用于不透明纹理.
  • PVRTC(PowerVR纹理压缩).由配备PowerVR GPU的设备(Nexus S,Kindle fire等)提供支持.
  • ATITC(ATI纹理压缩).用于具有Qualcomm(Nexus One等)的Adreno GPU的设备.
  • 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.               
         }
    
    }           
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将压缩纹理加载为原始数据.

  4. 使用glCompressedTexImage2D而不是glTexImage2D:

    public void onDrawFrame(GL10 gl) {
    
       ....
    
       gl.glCompressedTexImage2D(GL10.GL_TEXTURE_2D, level, internalformat, width, 
                                 height, border, imageSize, data);
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • 嗨@Xilliah,线程已经老了,你可能是对的,但是这个解决方案在我的几个项目中工作得很好**.如果您认为这是不正确的,您可以做两件事,或者您告诉您认为哪些是错的,我会很乐意尝试修复它或者请随意添加另一个答案并提供正确的解决方案......建设性意见! .谢谢. (2认同)

小智 5

这是一个ol线程,所以我想我会用http://devtools.ericsson.com/etc上提供的信息更新它 .在Khronos标准OpenGL ES 3.0和OpenGL 4.3中,ETC2是强制性的.