Pull to refresh

Comments 26

А других утилит сжатия, которые не дают артефактов, нету?
Есть отличная утилита — PVRTexTool. На высоких настройках качества выдает значительно лучший результат, чем компрессор в unity3d. Но артефакты все же могут присутствовать. PVRTC — очень жесткий алгоритм сжатия.
Статья полезная безусловно НО, компрессор в unity3d и есть утилита PVRTexTool.
Да, посмотрел в интернете, теперь вижу. Меня сбили с толку статьи, где сравнивали результаты PVRTexTool с результатами компрессии в Unity3D. Все дело в том, что некоторые версии unity3d выходили со старой версией данного инструмента.
Почитал описание алгоритма. Теперь понятно откуда такие артефакты. Видно, что формат поддерживает специальный режим, который позволяем с ними бороться. Видимо по умолчанию он не задействован.
В данном проекте мы используем EZ GUI
На всякий случай: это работает в PNG и в TGA, с PVRTC не пробовал.
Да, я тоже не пробовал такой подход. Но, при использовании EZ GUI в Unity все текстуры собираются в атласы, причем не ручками, а программно. И править их не только не желательно, но и трудоемко. Первый, кто перебилдит атлас, убьет все твои старания. А шум наложить можно очень быстро. Я использую экшен для фотошопа и применяю шум сразу ко все выбранным текстурам.
Только сейчас я понял, что в Unity уже реализован такой подход.
Но проблема артефактов остается в силе, т.к. данный алгоритм практически не работает с атласами интерфейсов, где между элементами обычно расстояние в пару пикселей.
Вот превью уже импортированной в статью текстуры:
Этот прием делается за считанные секунды, можно использовать и экшен. Так что никто ничего не убьет.
Дай мне попробовать такой атлас интерфейсов, я попробую обработать тем же методом и посмотрим, что получится.

А текстура из твоего примера обработана не так.
Вот как надо:


Собери из этих солдат атлас 512х512, объедени все слои (т.к. атлас UI генерируется програмно и все пишется в один слой) и попробуй свой метод. Если действительно так можно сделать быстро, то стоит попробовать пожать этот атлас PVRTC. Если несложно, выложи результат.
А текстура из моего примера — это превью уже заэкспортированного PNG файла в Unity. Этот процесс конролировать я не могу ровно так же, как и ручаться за тамошний алгоритм.
Процесс точно такой же, как и с одиночным спрайтом.

rghost.ru/41640158
C юнити я не работал, PVRTC жать не умею. Так что там тарга.

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

Alpha:
Я не совсем Вас понял про «альфу 1-бит»
Если взять исходную картинку в формате RGBA 5551?
Спасибо за инфу. Сами сейчас думаем, как пожать атласы покомпактнее…
В утилитах от PowerVR почему-то отсутствует опция с наилучшим качеством компрессии (4), которая тем не менее, есть в SDK. Я написал себе простейшую программу, которая использует их SDK, и получил намного лучшее качество. Время работы алгоритма тоже сильно увеличилось, но красота требует жертв.
Код «встроен» в достаточно большой фреймворк для работы с изображениями, и я не уверен, что могу его выложить целиком без согласования с работодателем. Опишу в общих словах, и таки дам ключевой кусок кода. Там все просто на самом деле.

1) Для начала изображение нужно прочитать из файла в память. Если это png, то его надо раскодировать в формат ARGB (32 bit). Для этого можно использовать любые средства, какие под руку подвернутся — хоть любимый игровой движок, хоть Qt, хоть libpng и ему подобные.
2) Затем изображение нужно «добить» до квадрата со стороной равной степени двойки — это требование формата pvrtc. Если вам не повезло, и у вас изображение 129 х 257, то будьте любезны сделать его 512 x 512 (квадрат нужен!).
3) Дальше вам понадобится сама библиотека libPVRTC. Скачать её можно здесь: www.imgtec.com/powervr/insider/powervr-sdk-docs.asp, но для этого придётся реально зарегистрироваться. Библиотека у них есть под Линукс, Мак и Винду.
4) И, наконец, немного кода: pastebin.com/y2xWqs7X

Будут вопросы — задавайте.

P.S. Забавный момент — для компрессии в PVRTC требуется изображение в формате ARGB. Несмотря на то, что в документации чётко написано RGBA. При этом декомпрессия из PVRTC осуществляется функцией pvrtc_decompress в формат RGBA, а не ARGB. Странно, да? Я спросил об этом на форуме разработчиков библиотеки, и мне ответили что-то вроде «ну это такая мелочь, всё равно мы на эту библиотеку уже давно забили». Как-то так. =)
Огромное спасибо автору за этот замечательный метод! Вы спасли меня от нервного срыва, а проект — от использования костыля в виде PNG-ткустур, которые в рантайме распаковывались бы в RGBA 16-bit и отжирали б кучу памяти.
Sign up to leave a comment.

Articles