Android-OpenGL纹理压缩

Android-OpenGL纹理压缩,android,opengl-es,textures,Android,Opengl Es,Textures,我需要一些帮助来查找有关如何在Android上使用纹理压缩的信息(或示例)。我现在有很多PNG,我需要减少它们占用的内存量。我正在研究PVR压缩,但我不知道如何在OpenGL中使用它 请给我指出正确的方向或提供一些例子,因为我找不到任何东西。您不应该在Android上只使用PVR压缩,因为这不适用于所有型号。为了避免这种情况,您应该只使用ETC1(所有GLE2.0设备都强制使用),或者为单独的GPU模式使用单独的纹理包。具有用于加载压缩格式的帮助器类 您可以使用来进行压缩 请注意,使用ETC1不

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


请给我指出正确的方向或提供一些例子,因为我找不到任何东西。

您不应该在Android上只使用PVR压缩,因为这不适用于所有型号。为了避免这种情况,您应该只使用ETC1(所有GLE2.0设备都强制使用),或者为单独的GPU模式使用单独的纹理包。具有用于加载压缩格式的帮助器类

您可以使用来进行压缩


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

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

  • ETC1(爱立信纹理压缩)。所有Android手机都支持这种格式。但是,它不支持alpha通道,因此只能用于不透明纹理
  • PVRTC(PowerVR纹理压缩)。由配备PowerVR GPU的设备(Nexus S、Kindle fire等)支持
  • ATITC(ATI纹理压缩)。用于配备高通公司(Nexus One等)的Adreno GPU的设备
  • S3TC(S3纹理压缩)。这种纹理压缩被用于英伟达芯片组集成设备(摩托罗拉XoOM等)
  • 中。
更详细的信息和信息

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

如何使用:

  • 压缩png文件(可以根据纹理类型使用、等工具)并添加到项目资源中

  • 如果不使用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.               
         }
    
    }           
    
  • 加载压缩纹理作为原始数据

  • 使用GLCompressedEximage2D而不是glTexImage2D:

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

  • 这是一个ol线程,所以我想我应该用上提供的信息来更新它
    在Khronos标准OpenGL ES 3.0和OpenGL 4.3中,ETC2是强制性的。

    只是想指出,并非所有android设备都支持etc1,与上面所说的相反

    警告:大多数Android设备都支持ETC1格式,但不能保证它可用。要检查设备是否支持ETC1格式,请调用ETC1Util.isETC1Supported()方法


    我确实尝试过,但是Eclipse不知道什么是ETC1Util,也找不到导入…有什么原因导致这个问题吗?“你应该只使用ETC1(在所有的GLE2.0设备上都强制使用)”我认为它在OpenGL ES上不是强制性的-在我看来,它看起来是一个扩展:看,它是GLE1.0/1.1的扩展,但是对于GLES 2.0.Hi@Xilliah来说是强制性的,线程是旧的,你可能是对的,但是这个解决方案在我的几个项目中运行得相当好。如果你认为它是不正确的,你可以做两件事,或者你告诉我你认为什么是错误的,我会很高兴尝试修复它,或者请随意添加另一个答案与正确的解决方案。。。请提出建设性意见!。谢谢,你好,格冈萨雷斯。我犯了一个错误,是不正确的,但由于某种原因无法删除该评论。只是我又傻了。你的回答有帮助!美好的很高兴为您提供帮助:)ETC可以与alpha一起使用,请参阅ETC纹理压缩和alpha通道处理Mali设备如何,我认为它们不支持这三种格式中的任何一种w/alpha。较新的版本可以使用ETC2,因为它是ES 3.0规范的一部分,但是如果你必须支持四种不同的压缩格式的纹理w/alpha,你最好不压缩它们,因为你不会节省任何磁盘空间。这太糟糕了,因此,似乎只有一个保证:
    在使用OpenGL ES 3.0 API时,ETC2/EAC纹理压缩格式保证可用。