Как же ты получаешь приличный цвет из 2BPP?

11

Я изучал текстуры PowerVR и столкнулся с несколькими текстурами, которые, по-видимому, имеют 2 бита на пиксель. Это, честно говоря, поражает меня. Как получить хотя бы половинное приличное сохранение цвета, когда у вас есть только 4 возможных состояния на пи на пиксель? Я был бы рад любым ресурсам, которые говорят о сжатии такого подвига. Спасибо!

Тодзи
источник
С JPG, вы можете получить приличный цвет с менее чем 1BPP :)
Иван Кукир

Ответы:

13

Кодирование PVRTC 2BPP, представленное в этой статье, делит изображение на блоки 8x4-текселей и сжимает каждый блок таким образом, что только два цвета RGB сохраняются для каждого тридцати двух блоков текселей.

Ни один из тридцати двух текселей не хранит свой собственный цвет - каждый тексель хранит только информацию о том, как смешиваться между двумя цветами RGB своего блока 8x4-текселей.

Если исходное изображение имеет текстовый блок 8x4 с радугой из 32 цветов, сжатие PVRTC 2BPP будет очень плохим для поддержания его качества, поскольку в PVRTC 2BPP каждый текстовый блок 8x4 имеет только два цвета RGB, с которыми можно смешиваться.

bmcnett
источник
Захватывающий! Большое спасибо. К сожалению, у меня много проблем с загрузкой бумаги, на которую вы ссылаетесь. Может быть, он размещен на Amazon EC2? ;)
Тодзи
6

Сжатие текстур не сжимает пиксели. Он сжимает блоки пикселей. Когда на отдельный пиксель ссылаются, графический процессор вычисляет, какой блок представляет пиксель. Затем он обрабатывает весь блок, чтобы получить цвет этого пикселя.

Пример

Предположим, что размер блока 4x4 пикселей на RGB-текстуре. Несжатый, каждый блок потребляет 4x4x3 = 48байты в памяти текстур.
Теперь алгоритм сжатия вычислит среднее значение для каждого канала (RGB) и сохранит его с блоком (3 байта). Теперь давайте дадим каждому пикселю 2 бита, чтобы отрегулировать среднее значение, чтобы пиксель был ближе к своему первоначальному цвету. Это еще один 4x4x2x3/8 = 12байт.
Общее количество байтов, используемых этим недавно изобретенным компрессором, составляет 15 байтов на блок, степень сжатия составляет 31,25%.

Мой мифический компрессор использует 7,5 бит / с. Это не так хорошо, как 2 bpp pvrtc, но теперь у вас есть приблизительное представление о том, как можно достичь 2 bbp.

обновление:
Я только что посмотрел на странице Википедии для PVRTC . Похоже, что pvrtc не использует традиционное сжатие на основе блоков. Вот документ , который описывает способ блока на основе сжатие работает и как PVRTC отличается. Особое примечание: блочные фильтры могут создавать прилично выглядящие изображения, используя 4bpp (без альфы), тогда как nvrtc может делать это с 2bpp.

deft_code
источник
1

@ Тодзи, сайт, на котором написана газета, немного темпераментный, но он сработал для меня сегодня утром. В противном случае, если у вас есть доступ к ACM / SIGGRAPH, он размещен здесь . Как ни странно, это было также на веб-сайте разработчика IMG / PowerVR (бесплатная регистрация), но я не могу найти правильный раздел. :-(

[ОБНОВЛЕНИЕ] Это все еще на сайте IMG здесь [/ ОБНОВЛЕНИЕ]

@bmcnet: PVRTC не разбивает текстуру на блоки, например, ETC или S3TC. FWIW, я экспериментировал с блочными текстурами, но я не мог найти способ упаковать достаточно данных в автономные блоки и все же получить желаемые результаты. Вместо этого это немного более «глобальная» система сжатия текстур. У него есть 2 изображения с низким разрешением, которые он билинейно масштабирует до целевого разрешения, а затем смешивает их вместе на основе тексель за текстилем.

Саймон Ф
источник