Избавление От Артефактов Сжатия Текстур Pvrtc



Проблемы При разработке мобильных игр многие сталкиваются с необходимостью уменьшить объем оперативной памяти или размер дистрибутива.

Чаще всего самыми тяжелыми ресурсами в проекте являются текстуры.

Несжатая текстура размером 1024x1024 занимает около 4 МБ.

И таких текстур в сцене обычно довольно много.

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

В unity3d для мобильных устройств существует несколько типов сжатия.

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

Размер текстур уменьшен в восемь раз, но появляются жуткие артефакты, особенно на прозрачных текстурах.

Данная тема призвана помочь в борьбе с последними.



Алгоритм

Суть алгоритма — постобработка текстур перед сжатием.

Для этого нам понадобится графический редактор, умеющий работать со слоями.

Я использовал Adobe Photoshop. Рассмотрим алгоритм подробно: 1) Откройте текстуру в Фотошопе и создайте новый слой поверх существующего.

2) Заполните его средним оттенком серого.



Избавление от артефактов сжатия текстур PVRTC



Избавление от артефактов сжатия текстур PVRTC

3) Далее добавьте к этому слою шум с настройками как на рисунке:

Избавление от артефактов сжатия текстур PVRTC

4) Установите режим наложения «Мягкий свет» и прозрачность от 30 до 50 процентов, чтобы шум был не сильно заметен, но все же был виден.



Избавление от артефактов сжатия текстур PVRTC

5) Сохраните и импортируйте текстуру.



Избавление от артефактов сжатия текстур PVRTC

Если текстура полупрозрачная, то просто выделите пиксели исходного слоя, инвертируйте выделение и удалите пиксели из зашумленного слоя.



Избавление от артефактов сжатия текстур PVRTC

После импорта остаётся только указать сжатие RGBA Compressed PVRTC 4bit. Я настоятельно рекомендую установить флажок «Переопределить» на вкладках импортера iOS и Android и указать «Лучшее по качеству сжатия».

Если ваша текстура будет использоваться для графического интерфейса, снимите флажок «Создать MIP-карты».

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



Результаты



Избавление от артефактов сжатия текстур PVRTC

Как видите, все артефакты благополучно исчезли.

Обратите внимание на зеленый камень и шестерню вокруг таймера вверху.



Заключение

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

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

За исключением очень мелких деталей, которые еще придется перенести в отдельные атласы и оставить в RGBA TrueColor. Но экономия памяти огромна.

Этот подход был успешно применен в совместном проекте Студия Unity Heyworks И iFree Инновации ДраконОно .

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

Теги: #unity3d #gamedev #разработка для мобильных устройств #разработка для iOS #разработка мобильных приложений #разработка игр

Вместе с данным постом часто просматривают: