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

Если вам нужно сжатие текстур, офлайн генерация MIP-текстурирования или кубическая карта, то такого формата текстур по умолчанию как PNG не будет достаточно. К счастью libGDX предоставляет для этого два варианта – ETC1 файлы и KTX/ZKT текстуры.

Заметим, что в настоящее время ETC1 и KTX/ZKTX не поддерживаются для GWT бекэнда.

Перед тем как вдаваться в подробности, нужно знать, что существует два типа сжатия:

  • Сжатие, используемое для хранения текстуры на диске (zip, png, jpg, ...), которое является полезным для уменьшения размеров вашего пакета приложения.
  • Сжатие, используемое для хранения текстуры в памяти (ETC1, ETC2, S3TC, ...), которое улучшает производительность игры и минимизирует память приложения во время выполнения (отсюда уменьшение риска, что Android выполнить перезапуск приложения при resume событии).

OpenGL ES 2.0 имеет только один обязательный формат сжатия текстуры: ETC1. Он позволяет уменьшить размер любого RGB8 изображения в шесть раз. Основной недостаток в том, что он является форматом сжатия с потерями. Другой недостаток, что он ограничен RGB8. Для поддержки альфа канала вы должны хранить альфу отдельно:

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

Экономия видео памяти упадет с 6x до 4x, но это все же стоит усилий. Пример приведен в KTXTest.

ETC1 формат

Формат файла ETC1 является очень простым форматом, особенно для libGDX. Он дает прямой способ поддержки 2D текстур с ETC1 сжатием. Недостатком является невозможность использования MIP-текстурирования и кубической карты.

Сжатие

Сжатие Pixmap, загруженного из файла, и запись его в наш ETC1 файл очень простое:

Pixmap pixmap = new Pixmap(Gdx.files.absolute("image.png");
ETC1.encodeImagePKM(pixmap).write(Gdx.files.absolute("image.etc1"));

Вы также можете использовать утилиту ETC1Compressor из gdx-tools проекта, которая может конвертировать целую иерархию папок.

Загрузка

Когда у вас есть файл со сжатым ETC1 изображением, вы легко может загрузить его, как и любой другой файл изображения:

Texture texture = new Texture(Gdx.files.internal("image.etc1"));

KTX/ZKTX формат

Формат KTX файла является стандартом, предназначенным для хранения OpenGL текстур. Его главное преимущество в поддержке большинства возможностей OpenGL текстур (все форматы сжатия, с или без MIP-текстурирования, кубические карты, массивы текстур и так далее)

Формат ZKTX это просто сжатый (ZIP) KTX, чтобы уменьшить размер файла на диске.

Подготовка файла

Утилита KTXProcessor в gdx-tools проекте предоставляет простой способ подготовки текстур:

использование: KTXProcessor input_file output_file [-etc1|-etc1a] [-mipmaps]
  input_file  Файл текстуры, включаемый в выходной KTX или ZKTX файл
              Для кубических карт, просто предоставьте 6 входных файлов для соответствующих граней в следующем порядке: X+, X-, Y+, Y-, Z+, Z-
  output_file Путь выходного файла, его тип основывается на расширении, которое должно быть KTX или ZKTX

  опции:
    -etc1    Входной файл будет запакован с использованием ETC1 сжатия, альфа канал отбрасывается
    -etc1a   Входной файл будет запакован с использованием ETC1 сжатия, удвоением высоты и размещением альфа канала в нижней части
    -mipmaps Входной файл будет обработан для генерации MIP-текстурирования

  примеры:
    KTXProcessor in.png out.ktx                                        Создает KTX файл с предоставленной 2D текстурой
    KTXProcessor in.png out.zktx                                       Создает ZKTX файл предоставленной 2D текстурой
    KTXProcessor in.png out.zktx -mipmaps                              Создает ZKTX файл предоставленной 2D текстурой, генерируя все уровни MIP-текстурирования
    KTXProcessor px.ktx nx.ktx py.ktx ny.ktx pz.ktx nz.ktx out.zktx    Создает ZKTX файл предоставленными текстурами кубической карты
    KTXProcessor in.ktx out.zktx                                       Преобразовывает KTX файл в ZKTX файл

Есть также много сторонних утилит для подготовки KTX текстурных файлов.

  • OpenGL SDK предоставляет утилиты для создания KTX файлов.
  • Mali SDK предоставляет утилиты для создания KTX файлов, включая обработку альфа канала.

Загрузка

Когда у вас есть файл со сжатым KTX или ZKTX изображением, вы легко может загрузить его, как и любой другой файл изображения:

Texture texture = new Texture(Gdx.files.internal("image.zktx"));