Android OpenGL Сжатие текстур - PullRequest
       5

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

55 голосов
/ 05 февраля 2012

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

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

Ответы [ 4 ]

84 голосов
/ 01 марта 2012

В 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);
    
    }
    
5 голосов
/ 24 марта 2013

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

3 голосов
/ 22 апреля 2014

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

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

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

3 голосов
/ 05 февраля 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...