Сжатие Текстур в Android*

Введение

Нанесение изображения, то есть текстуры, на двухмерную или трехмерную модель для повышения детализации графики является крайне распространенной методикой в области компьютерной графики. В системе Android допускается использование различных форматов текстур, каждый из которых обладает определенным набором преимуществ и недостатков. В образце Android Texture Compression разработчики могут с легкостью сравнивать работу с текстурами в четырех различных форматах сжатия: PNG, сжатие текстур Ericsson (ETC), сжатие текстур PowerVR* (PVRTC) и сжатие текстур S3 (S3TC), которое также называется сжатием текстур DirectX* (DXTC). В образце кода показано, как загружать и использовать эти форматы в OpenGL ES* на платформе Android. Все поддерживаемые форматы текстур показаны рядом для удобства сравнения объема файлов и качества изображения. Выбор нужного формата сжатия поможет разработчикам сбалансировать объем приложений, качество и производительность приложений.

В образце кода происходит загрузка каждого формата текстуры, определение координат наложения текстуры и отображается фрагмент каждой текстуры. В результате будет показано полное изображение с текстурой в виде четырех отдельных текстур каждого формата. В верхней части экрана будет отмечен формат, а внизу — размер файла.

Общие сведения о принципах работы, связанные термины и форматы текстур

Наложение текстур — это метод, при помощи которого на поверхность какой-либо фигуры или многоугольника накладывается изображения. Для простоты можно использовать следующую аналогию: текстура — это оберточная бумага, а трехмерная модель — это коробка с подарком, которую нужно завернуть в эту бумагу. Поэтому процесс наложения текстур еще иногда называют «обертыванием в текстуры».


Рисунок 1. 1 — модель танка, состоящая только из фигур и многоугольников. 2 — эта же модель танка с наложенными текстурами.

MIP-карты — это оптимизированные группы изображений, созданные на основе первоначальной текстуры (аббревиатура «MIP» происходит от латинской фразы «multim in parvo», что означает «многое в малом»). Они обычно создаются для увеличения скорости отрисовки и снижения неровностей сглаживания. Каждое MIP-изображение (растровое изображение из набора MIP-карты) представляет собой версию первоначальной текстуры с пониженным разрешением. MIP-изображения используются вместо первоначальных текстур, когда объект находится на большом расстоянии от зрителя или значительно уменьшен. В основе идеи создания и реализации MIP-карт лежит следующий простой принцип: человеческий глаз не может различать мелкие детали объектов, если объекты расположены далеко от нас или имеют маленький размер. Следовательно, в зависимости от размера объектов и расстояния до них можно использовать вместо полноразмерных текстур различные MIP-изображения для различных частей отображаемых объектов. MIP-изображения в силу меньшего разрешения имеют намного меньшее количество текселей (пикселей текстуры), поэтому при отрисовке приходится обрабатывать намного меньше данных, и скорость отрисовки увеличивается. Кроме того, MIP-изображения обычно сглажены, поэтому существенно сокращается и количество заметных артефактов сглаживания. Образец содержит примеры MIP-карт формата PNG, ETC (KTX), PVRTC и S3TC.


Рисунок 2. Пример цепочки изображений в составе MIP-карты.

Portable Network Graphics (PNG)

PNG is a bitmapped image format primarily noted for its lossless data file compression. The image format is equipped with support for palette-based images (24-bit RGB or 32-bit RGBA) or grayscale images (with and without an alpha channel).

Преимущества:

  • Сжатие без потерь, высокое качество изображения
  • Поддерживается 8- и 16-разрядный канал прозрачности.

Недостатки:

  • Большой размер файлов, из-за чего возрастает объем приложений и используется больше памяти
  • Используется больше всего вычислительных ресурсов GPU (т.е. наихудшая производительность).

Ericsson Texture Compression (ETC)

Ericsson Texture Compression — это формат сжатия текстур, выпущенный компанией Khronos для OpenGL ES 2.0 в качестве стандарта. Поэтому этот формат сжатия доступен практически на всех устройствах с Android. Схема сжатия текстур, упоминаемая здесь, также называется ETC1 (следующая версия, называемая ETC2, пока находится на этапе разработки и отладки). ETC1 поддерживает сжатие 24-разрядных данных RGB, но сжатие изображений и текстур с альфа-компонентами не поддерживается. Кроме того, в категорию формата сжатия текстур ETC входят два разных формата: KTX и PKM. KTX — это стандартный формат сжатия компании Khronos Group, он предоставляет контейнер для множества изображений и текстур. При создании MIP-карт в формате KTX создается только один KTX-файл. PKM — это гораздо более простой формат, применяющийся главным образом для сжатия одиночных изображений. При создании MIP-карты в формате PKM будет создано множество PKM-файлов, поэтому использовать этот формат для данной цели не рекомендуется..

Преимущества:

  • Размер файлов существенно меньше по сравнению с PNG.
  • Поддерживается аппаратное ускорение графическими процессорами практически на всех устройствах Android.

Недостатки:

  • Качество ниже, чем при использовании PNG (поскольку формат ETC предусматривает сжатие с потерями).
  • Отсутствует поддержка альфа-каналов и компонентов.

Средства для сжатия изображений:

PowerVR Texture Compression (PVRTC)

PVRTC — это формат сжатия текстур с потерями с фиксированным размером выходных данных. Он применяется главным в технологиях PowerVR MBX, SGX и Rogue компании Imagination Technologies. В настоящее время этот формат сжатия является стандартным на всех устройствах iPhone*, iPod* и iPad*. В отличие от ETC и S3TC, алгоритм PVRTC работает не на основе блоков. Вместо этого применяется двухлинейное укрупнение и грубое смешение двух изображений с низким разрешением. Помимо уникального алгоритма сжатия в формате PVRTC, поддерживается RGBA (с альфа-каналом) для режимов сжатия «2 бита на пиксель» и «4 бита на пиксель».

Преимущества:

  • Поддержка альфа-каналов и компонентов.
  • Поддержка RGBA для режимов «2 бита на пиксель» и «4 бита на пиксель».
  • Размер файлов гораздо меньше по сравнению с PNG.
  • Аппаратное ускорение графическими процессорами PowerVR

Недостатки:

  • Качество ниже, чем при использовании PNG (поскольку формат PVRTC предусматривает сжатие с потерями).
  • Формат PVRTC поддерживается только оборудованием PowerVR.
  • Гарантируется поддержка только квадратных текстур (т.е. текстур, площадь которых равна квадрату длины любой из сторон), хотя в некоторых случаях поддерживается сжатие и прямоугольных текстур.
  • Сжатие текстур в этот формат может происходить довольно медленно.

Программные средства для сжатия:

S3 Texture Compression (S3TC) or DirectX Texture Compression (DXTC)

S3TC — это формат сжатия текстур с потерями с фиксированным размером выходных данных. Благодаря алгоритму сжатия формат S3TC является идеальным форматом сжатия текстур для трехмерной компьютерной графики с аппаратным ускорением. После интеграции S3TC в состав Microsoft DirectX 6.0 и OpenGL* 1.3 этот формат сжатия получил исключительно широкое распространение. Существует не менее 5 разновидностей формата S3TC (от DXT1 до DXT5 включительно). В образце поддерживаются часто используемые разновидности (DXT1, DXT3 и DXT5).

DXT1. Формат DXT1 из всех разновидностей S3TC обеспечивает самое сильное сжатие: каждый блок из 16 пикселей преобразуется в 64 бита. Также используются два различных 16-битных значения цветов RGB (5:8:5) и 2-битная таблица подстановок 4х4. DXT1 не поддерживает альфа-каналы.

DXT3. При использовании формата DXT3 каждый блок из 16 пикселей преобразуется в 128 бит: 64 бита данных альфа-канала и 64 бита данных цвета. Формат DXT3 прекрасно подходит для изображений и текстур с резким изменением альфа-канала, т.е. прозрачности.

DXT5. При использовании формата DXT5 каждый блок из 16 пикселей преобразуется в 128 бит: 64 бита данных альфа-канала и 64 бита данных цвета. Формат DXT5 прекрасно подходит для изображений и текстур с плавным, постепенным изменением альфа-канала.

Преимущества:

    • Размер файлов существенно меньше по сравнению с PNG.
    • Неплохое качество, мало наложений (артефакты не слишком заметны).
    • Высокая скорость компрессии/декомпрессии изображений.
    • Аппаратное ускорение обработки графическими процессорами реализовано в огромном количестве видеоадаптеров: аппаратные поддержка применяется практически повсеместно на настольных ПК и постепенно охватывает устройства на базе Android.

 

Недостатки:

  • Качество ниже, чем при использовании PNG (поскольку формат S3TC предусматривает сжатие с потерями).
  • Поддерживается не всеми устройствами на базе Android.

Программные средства для сжатия:

Доступ к данным текстур

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

Наша задача — загрузить и наложить данные текстуры из каждого файла (с различным форматом сжатия) на двухмерную модель для сравнения качества и размера файла. При этом заголовок, находящийся перед данными, не следует накладывать на модель вместе с текстурой, поскольку это приведет к искажениям изображения. Заголовки файлов различаются в зависимости от используемого формата файлов; каждому формату требуется собственная поддержка для загрузки текстур и правильного их наложения.

ВАЖНО:

Заголовок PVRTC упаковывается из-за наличия части данных 64-разрядного формата изображения (в образце — mPixelFormat). ARM пытается выровнять заголовок, добавив в него 4 дополнительных байта, из-за чего заголовок становится размером в 56 байт вместо первоначальных 52 байт. Это, в свою очередь, приводит к искажению изображения на устройстве с процессором ARM. В устройствах с процессорами Intel заголовок не дополняется, поэтому там описываемая проблема отсутствует. Проблема с дополнением заголовка в устройствах ARM решается упаковкой заголовка, после чего текстура правильно отображается на устройствах как с процессорами ARM, так и с процессорами Intel.


Figure 3 – Image of ARM Padding Issue with PVRTC

Загрузка и поддержка различных форматов текстур

Загрузка PNG

Для работы с MIP-картами в PNG используется простая функция glGenerateMipmap — это готовая функция Khronos OpenGL, предназначенная для данной цели. Для чтения и загруки PNG-файлов был использован общедоступный код Шона Баррета stb_image.c (а также для обнаружения и выбора данных текстуры для обработки). В следующем примере кода происходит инициализация текстуры и реализуется поддержка MIP-карты для формата сжатия PNG.

//Инициализация текстуры
glTexImage2D( GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, pData );

//Создание Mipmap 
glGenerateMipmap( GL_TEXTURE_2D );

Загрузка ETC

Как уже было сказано выше, ETC включает два разных формата, KTX и PKM. KTX — это стандартный формат сжатия компании, он служит контейнером для множества изображений и текстур и идеально подходит для MIP-карт. PKM, напротив, предназначен для сжатия одиночных текстур, поэтому при создании MIP-карт получится множество PKM-файлов, что неэффективно. Поэтому в образце приложения поддержка MIP-карт в формате ETC реализована только для KTX. Компания Khronos предоставляет библиотеку на языке C с открытым исходным кодом (libktx), к оторой поддерживается загрузка текстур KTX с MIP-картами. Мы применили это средство и реализовали код в функции загрузки текстуры под названием LoadTextureETC_KTX. Для загрузи файла со сжатой текстурой в формате KTX используется функция ktxLoadTextureM (она загружает нужную текстуру из данных в памяти). Эта функция (ktxLoadTextureM) содержится в библиотеке (libktx), а документация находится на сайте Khronos (см. раздел «Ресурсы» ниже).

В следующем примере кода происходит инициализация текстуры и реализуется поддержка MIP-карты для формата сжатия ETC (KTX):

    // Генерация обработки и загрузка текстуры
    GLuint handle = 0;
    GLenum target;
    GLboolean mipmapped;
       
    KTX_error_code result = ktxLoadTextureM( pData, fileSize, &handle, &target, NULL, &mipmapped, NULL, NULL, NULL );
       
    if( result != KTX_SUCCESS )
    {
        LOGI( "KTXLib couldn't load texture %s. Error: %d", TextureFileName, result );
        return 0;
    }
 
    //Привязка текстуры
    glBindTexture( target, handle );

Загрузка PVRTC

Поддержка MIP-карт для текстур PVRTC работает немного сложнее. После прочтения заголовка определяется величина смещения как сумма размера заголовка и метаданных (метаданные следуют за заголовком и также не относятся к самим данным текстуры). Для каждой созданной MIP-текстуры пиксели группируются в блоки (разного размера в зависимости от режима — 4 либо 2 бита на пиксель, оба варианта допустимы в формате PVRTC). Затем происходит так называемая «фиксация» — высота и ширина блоков ограничиваются определенными пределами. После этого вызывается функция glCompressedTexImage() для идентификации двухмерного изображения в сжатом формате PVRTC. После этого вычисляется размер данных пикселей, он добавляется к смещению, чтобы сгруппировать набор пикселей следующей MIP-текстуры. Этот процесс повторяется до обработки всех MIP-текстур.

    //Инициализация текстуры
    unsigned int offset = sizeof(PVRHeaderV3) + pHeader->mMetaDataSize;
    unsigned int mipWidth = pHeader->mWidth;
    unsigned int mipHeight = pHeader->mHeight;

    unsigned int mip = 0;
    do
    {
        // Определение размера (ширина * выстоа * bbp/8), мин. размер  - 32
        unsigned int pixelDataSize = ( mipWidth * mipHeight * bitsPerPixel ) >> 3;
        pixelDataSize = (pixelDataSize < 32) ? 32 : pixelDataSize;

        // Загрузка данных текстуры для MIP
        glCompressedTexImage2D(GL_TEXTURE_2D, mip, format, mipWidth, mipHeight, 0, pixelDataSize, pData + offset);
        checkGlError("glCompressedTexImage2D");
    
        // Следующие MIP имеют в 2 раза меньший размер, минимально - 1
        mipWidth  = ( mipWidth >> 1 == 0 ) ? 1 : mipWidth >> 1;
        mipHeight = ( mipHeight >> 1 == 0 ) ? 1 : mipHeight >> 1;

        //Переход к следующему MIP
        offset += pixelDataSize;
        mip++;
    } while(mip < pHeader->mMipmapCount);

Загрузка S3TC

После загрузки файла текстуры S3TC, определения формата файла и прочитывания данных после заголовки нужно реализовать поддержку MIP-карт. Каждая MIP-текстура зацикливается, а пиксели группируются в блоки. После этого вызывается функция glCompressedTexImage для идентификации двухмерного изображения в сжатом формате S3TC. Совокупный размер данных блоков добавляется к смещению, чтобы затем перейти к следующей MIP-текстуре и выполнить такие же действия. Этот процесс повторяется до обработки всех MIP-текстур. В следующем примере кода происходит инициализация текстуры и реализуется поддержка MIP-карты для формата сжатия S3TC.

    //Инициализация текстуры
    unsigned int offset = 0;
    unsigned int width = pHeader->mWidth;
    unsigned int height = pHeader->mHeight;

    unsigned int mip = 0;
    do
    {
        //Определение размера
        //Как определено в расширении: size = ceil(<w>/4) * ceil(<h>/4) * blockSize
        unsigned int Size = ((width + 3) >> 2) * ((height + 3) >> 2) * blockSize;
   
        glCompressedTexImage2D( GL_TEXTURE_2D, mip, format, width, height, 0, Size, (pData + sizeof(DDSHeader)) + offset );
        checkGlError( "glCompressedTexImage2D" );
   
        offset += Size;
        if( ( width <<= 1 ) == 0) width = 1;
        if( ( height <<= 1 ) == 0) height = 1;

        mip++;
    } while( mip < pHeader->mMipMapCount );

Заключение

В зависимости от сценариев использования правильный выбор алгоритма сжатия текстур поможет повысить качество изображения, существенно снизить объем приложения и увеличить скорость его работы. Оптимальное сжатие текстур обеспечивает важные преимущества разработчикам и их приложениям. В образце приложения Android Texture Compression показана загрузка и доступ к популярным форматам текстур на платформе Android. Загрузите исходный код и применяйте оптимальные методики сжатия текстур в своих проектах.

Об авторе

Уильям Гуо (William Guo) создал этот образец файла во время стажировки в команде Intel Personal Form Factor, в ходе работы над смартфонами и планшетами Intel. В настоящее время он учится в Калифорнийском университете в Беркли на втором курсе и должен получить диплом в мае 2015 года. Уильям намеревается получить степень магистра в области электротехники и компьютерных наук, а также, возможно, получить дополнительное образование по психологии.

Ресурсы:

BSD2.0.txt
TextureLoader.zip
libktx-license.txt
README.txt

  1. Рисунок 1 (наложение текстур): 
    http://upload.wikimedia.org/wikipedia/commons/3/30/Texturedm1a2.png
  2. Рисунок 2 (MIP-карта):
    http://en.wikipedia.org/wiki/File:MipMap_Example_STS101.jpg
  3. Информация о PNG:
    http://en.wikipedia.org/wiki/Portable_Network_Graphics
    http://www.libpng.org/pub/png/
  4. Информация о ETC (KTX и PKM):
    http://en.wikipedia.org/wiki/Ericsson_Texture_Compression
    http://devtools.ericsson.com/etc
    http://www.khronos.org/opengles/sdk/tools/KTX/doc/libktx/index.html
  5. Информация о PVRTC 
    http://en.wikipedia.org/wiki/PVRTC
    http://web.onetel.net.uk/~simonnihal/3d.html
  6. Информация о S3TC:
    http://en.wikipedia.org/wiki/S3_Texture_Compression
    http://www.opengl.org/registry/specs/EXT/texture_compression_s3tc.txt

Примечания

ИНФОРМАЦИЯ В ДАННОМ ДОКУМЕНТЕ ПРИВЕДЕНА ТОЛЬКО В ОТНОШЕНИИ ПРОДУКТОВ INTEL. ДАННЫЙ ДОКУМЕНТ НЕ ПРЕДОСТАВЛЯЕТ ЯВНОЙ ИЛИ ПОДРАЗУМЕВАЕМОЙ ЛИЦЕНЗИИ, ЛИШЕНИЯ ПРАВА ВОЗРАЖЕНИЯ ИЛИ ИНЫХ ПРАВ НА ИНТЕЛЛЕКТУАЛЬНУЮ СОБСТВЕННОСТЬ. КРОМЕ СЛУЧАЕВ, УКАЗАННЫХ В УСЛОВИЯХ И ПРАВИЛАХ ПРОДАЖИ ТАКИХ ПРОДУКТОВ, INTEL НЕ НЕСЕТ НИКАКОЙ ОТВЕТСТВЕННОСТИ И ОТКАЗЫВАЕТСЯ ОТ ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ ГАРАНТИЙ В ОТНОШЕНИИ ПРОДАЖИ И/ИЛИ ИСПОЛЬЗОВАНИЯ СВОИХ ПРОДУКТОВ, ВКЛЮЧАЯ ОТВЕТСТВЕННОСТЬ ИЛИ ГАРАНТИИ ОТНОСИТЕЛЬНО ИХ ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ, ОБЕСПЕЧЕНИЯ ПРИБЫЛИ ИЛИ НАРУШЕНИЯ КАКИХ-ЛИБО ПАТЕНТОВ, АВТОРСКИХ ПРАВ ИЛИ ИНЫХ ПРАВ НА ИНТЕЛЛЕКТУАЛЬНУЮ СОБСТВЕННОСТЬ.

КРОМЕ СЛУЧАЕВ, СОГЛАСОВАННЫХ INTEL В ПИСЬМЕННОЙ ФОРМЕ, ПРОДУКТЫ INTEL НЕ ПРЕДНАЗНАЧЕНЫ ДЛЯ ИСПОЛЬЗОВАНИЯ В СИТУАЦИЯХ, КОГДА ИХ НЕИСПРАВНОСТЬ МОЖЕТ ПРИВЕСТИ К ТРАВМАМ ИЛИ ЛЕТАЛЬНОМУ ИСХОДУ.

Корпорация Intel оставляет за собой право вносить изменения в технические характеристики и описания своих продуктов без предварительного уведомления. Проектировщики не должны полагаться на отсутствующие характеристики, а также характеристики с пометками «зарезервировано» или «не определено». Эти характеристики резервируются Intel для будущего использования, поэтому отсутствие конфликтов совместимости для них не гарантируется. Информация в данном документе может быть изменена без предварительного уведомления. Не используйте эту информацию в окончательном варианте дизайна.

Продукты, описанные в данном документе, могут содержать ошибки и неточности, из-за чего реальные характеристики продуктов могут отличаться от приведенных здесь. Уже выявленные ошибки могут быть предоставлены по запросу.

Перед размещением заказа получите последние версии спецификаций в региональном офисе продаж Intel или у местного дистрибьютора.

Номерные копии документов, на которые имеются ссылки в данном документе, а также другие материалы Intel можно заказать по телефону 1-800-548-4725 или загрузить по адресу  http://www.intel.com/design/literature.htm.

Программное обеспечение и нагрузки, использованные в тестах производительности, могли быть оптимизированы для достижения высокой производительности на микропроцессорах Intel. Тесты производительности, такие как SYSmark и MobileMark, проводятся на определенных компьютерных системах, компонентах, программах, операциях и функциях. Любые изменения любого из этих элементов может привести к изменению результатов. При выборе приобретаемых продуктов следует обращаться к другой информации и тестам производительности, в том числе к тестам производительности определенного продукта в сочетании с другими продуктами.

Данный документ и описываемое в нем программное обеспечение предоставляются по лицензии и могут использоваться и распространяться только согласно условиям лицензии.

Intel® и эмблема Intel являются товарными знаками корпорации Intel в США и в других странах.

OpenGL является охраняемым товарным знаком Silicon Graphics, Inc. в США и в других странах.

© Intel Corporation, 2012. Все права защищены.

* Другие наименования и торговые марки могут быть собственностью третьих лиц.