Если вам нужно сжатие текстур, офлайн генерация 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"));
Комментариев нет:
Отправить комментарий