2012-02-05 7 views
54

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

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

ответ

82

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

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

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

Короче говоря, если ваши текстуры не имеют альфа, вы можете использовать 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

Привет @Xilliah, поток старый, и возможно, вы правы **, но это решение хорошо работает в нескольких моих проектах **. Если вы считаете, что это неправильно, вы можете сделать две вещи, или вы скажете, что, по вашему мнению, не так, и я буду рад попытаться ее исправить или, пожалуйста, не стесняйтесь добавить еще один ответ с правильным решением ... Конструктивные комментарии, пожалуйста! .Благодаря. – gergonzalez

+0

Hello Gergonzalez. Я допустил ошибку и был неправильным, но по какой-то причине не смог удалить комментарий. Только я снова глуп. Ваш ответ помог! – Xilliah

+0

Ницца! Рад помочь :) – gergonzalez

3

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

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

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

+0

Я попытался, что однако Eclipse, не знает, что ETC1Util есть и не может найти импорт ... никаких оснований для этого вопроса? – Chris

+0

_ «вы должны использовать только ETC1 (на всех устройствах GLES 2.0)» _ Я не думаю, что это обязательно для OpenGL ES. Мне кажется, что это расширение: см. Http: //www.khronos .org/registry/gles/ –

+2

Это расширение для GLES 1.0/1.1, но оно предназначено для GLES 2.0. –

5

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

2

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

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

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

+2

Это отстой, поэтому есть только одна гарантия: «Форматы сжатия текстур ETC2/EAC гарантированно будут доступны при использовании OpenGL ES 3.0 API». – leetNightshade

Смежные вопросы