Comments 26
А других утилит сжатия, которые не дают артефактов, нету?
0
Есть отличная утилита — PVRTexTool. На высоких настройках качества выдает значительно лучший результат, чем компрессор в unity3d. Но артефакты все же могут присутствовать. PVRTC — очень жесткий алгоритм сжатия.
0
Статья полезная безусловно НО, компрессор в unity3d и есть утилита PVRTexTool.
0
Почитал описание алгоритма. Теперь понятно откуда такие артефакты. Видно, что формат поддерживает специальный режим, который позволяем с ними бороться. Видимо по умолчанию он не задействован.
0
А какой 2D фреймворк используете в Unity?
0
Зачем портить текстуру шумом?
Есть такой метод: doom2d.org/forum/viewtopic.php?f=16&t=180
Кратко говоря, подкладываем под альфу цвета спрайта.
Есть такой метод: doom2d.org/forum/viewtopic.php?f=16&t=180
Кратко говоря, подкладываем под альфу цвета спрайта.
0
На всякий случай: это работает в PNG и в TGA, с PVRTC не пробовал.
0
Да, я тоже не пробовал такой подход. Но, при использовании EZ GUI в Unity все текстуры собираются в атласы, причем не ручками, а программно. И править их не только не желательно, но и трудоемко. Первый, кто перебилдит атлас, убьет все твои старания. А шум наложить можно очень быстро. Я использую экшен для фотошопа и применяю шум сразу ко все выбранным текстурам.
0
Только сейчас я понял, что в Unity уже реализован такой подход.
Но проблема артефактов остается в силе, т.к. данный алгоритм практически не работает с атласами интерфейсов, где между элементами обычно расстояние в пару пикселей.
Вот превью уже импортированной в статью текстуры:
Но проблема артефактов остается в силе, т.к. данный алгоритм практически не работает с атласами интерфейсов, где между элементами обычно расстояние в пару пикселей.
Вот превью уже импортированной в статью текстуры:
0
Этот прием делается за считанные секунды, можно использовать и экшен. Так что никто ничего не убьет.
Дай мне попробовать такой атлас интерфейсов, я попробую обработать тем же методом и посмотрим, что получится.
А текстура из твоего примера обработана не так.
Вот как надо:
Дай мне попробовать такой атлас интерфейсов, я попробую обработать тем же методом и посмотрим, что получится.
А текстура из твоего примера обработана не так.
Вот как надо:
+1
Собери из этих солдат атлас 512х512, объедени все слои (т.к. атлас UI генерируется програмно и все пишется в один слой) и попробуй свой метод. Если действительно так можно сделать быстро, то стоит попробовать пожать этот атлас PVRTC. Если несложно, выложи результат.
А текстура из моего примера — это превью уже заэкспортированного PNG файла в Unity. Этот процесс конролировать я не могу ровно так же, как и ручаться за тамошний алгоритм.
А текстура из моего примера — это превью уже заэкспортированного PNG файла в Unity. Этот процесс конролировать я не могу ровно так же, как и ручаться за тамошний алгоритм.
0
Процесс точно такой же, как и с одиночным спрайтом.
rghost.ru/41640158
C юнити я не работал, PVRTC жать не умею. Так что там тарга.
Покажи, что получится, интересно.
rghost.ru/41640158
C юнити я не работал, PVRTC жать не умею. Так что там тарга.
Покажи, что получится, интересно.
0
Попробовал. Проблема в том, что PVRTC жмет и альфу. И артефакты все равно вылазят. Твой подход можно наверно испозовать с шейдером, где альфа отдельно от дифуза. И альфу не сжимать.
Вот результаты.
Difuse:
Alpha:
Вот результаты.
Difuse:
Alpha:
0
Спасибо за инфу. Сами сейчас думаем, как пожать атласы покомпактнее…
0
спасибо за статью )
+1
В утилитах от PowerVR почему-то отсутствует опция с наилучшим качеством компрессии (4), которая тем не менее, есть в SDK. Я написал себе простейшую программу, которая использует их SDK, и получил намного лучшее качество. Время работы алгоритма тоже сильно увеличилось, но красота требует жертв.
0
подЕлитесь?)
0
Код «встроен» в достаточно большой фреймворк для работы с изображениями, и я не уверен, что могу его выложить целиком без согласования с работодателем. Опишу в общих словах, и таки дам ключевой кусок кода. Там все просто на самом деле.
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. Странно, да? Я спросил об этом на форуме разработчиков библиотеки, и мне ответили что-то вроде «ну это такая мелочь, всё равно мы на эту библиотеку уже давно забили». Как-то так. =)
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. Странно, да? Я спросил об этом на форуме разработчиков библиотеки, и мне ответили что-то вроде «ну это такая мелочь, всё равно мы на эту библиотеку уже давно забили». Как-то так. =)
0
Огромное спасибо автору за этот замечательный метод! Вы спасли меня от нервного срыва, а проект — от использования костыля в виде PNG-ткустур, которые в рантайме распаковывались бы в RGBA 16-bit и отжирали б кучу памяти.
0
Sign up to leave a comment.
Избавление от артефактов сжатия PVRTC текстур