Подтвердить что ты не робот

Сжатие текстуры Android OpenGL

Мне нужна помощь в поиске информации (или примера) о том, как использовать сжатие текстур для Android. Сейчас у меня много PNG, и мне нужно уменьшить объем памяти, который они используют. Я смотрел на сжатие PVR, но я не могу понять, как использовать это в OpenGL.

Может ли кто-нибудь указать мне в правильном направлении или предложить несколько примеров, поскольку я ничего не могу найти.

4b9b3361

Ответ 1

В Android поддерживается в основном четыре типа сжатия текстур:

  • ETC1 (сжатие текстур Ericsson). Этот формат поддерживается всеми телефонами Android. Но он не поддерживает альфа-канал, поэтому может использоваться только для непрозрачных текстур.
  • PVRTC (сжатие текстур PowerVR). Поддерживается устройствами с графическими процессорами PowerVR (Nexus S, Kindle fire и т.д.).
  • ATITC (сжатие текстур ATI). Используется в устройствах с графическим процессором Adreno от Qualcomm (Nexus One и т.д.).
  • S3TC (сжатие текстур S3). Это сжатие текстур используется в устройствах с чипсетом NVIDIA (Motorola Xoom и т.д.)

Более подробная информация здесь и здесь.

Короче говоря, если у ваших текстур нет альфы, вы можете использовать ETC1. Если у них есть альфа, и вы хотите поддерживать все устройства, вы должны сжать свои текстуры в трех других типах и загрузить их в соответствии с устройством.

Как пользоваться:

  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);
    
    }
    

Ответ 2

Это поток ol, поэтому я решил обновить его с помощью информации, доступной на http://devtools.ericsson.com/etc ETC2 является обязательным в стандартах Khronos OpenGL ES 3.0 и OpenGL 4.3.

Ответ 3

Вы не должны использовать только сжатие PVR на Android, так как это не будет работать со всеми моделями. Чтобы обойти это, вы должны либо использовать только ETC1 (предусмотренные на всех устройствах GLES 2.0), либо иметь отдельные пакеты текстур для отдельных режимов графического процессора. В руководстве для разработчиков Android есть вспомогательный класс для загрузки формата сжатия.

Вы можете использовать etcpack для сжатия.

Обратите внимание, что вы не получите альфа-канал с ETC1 - вы можете сделать некоторые причудливые теневые тэки фрагментов, чтобы обойти это, имея альфа-канал в качестве отдельной текстуры.

Ответ 4

Просто хочу указать, что etc1 не поддерживается всеми устройствами Android, вопреки тому, что gergonzalez сказал

Внимание: формат ETC1 поддерживается большинством устройств Android, но он не гарантированно будет доступен. Чтобы проверить, поддерживается ли формат ETC1 на устройстве, вызовите метод ETC1Util.isETC1Supported().

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