Як на землі ви отримуєте пристойний колір із 2BPP?


11

Я розглядав текстури PowerVR і зіткнувся з кількома текстурами, які, мабуть, 2 біти на піксель. Це, чесно кажучи, кидає мені думку. Як можна отримати навіть наполовину гідне збереження кольору, якщо у вас є лише 4 можливі стани на пі на піксель? Мені б хотілося, щоб будь-які ресурси там говорили про стиснення такого подвигу. Дякую!


За допомогою JPG ви зможете отримати пристойний колір з під 1BPP :)
Іван Кукір

Відповіді:


13

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

Жоден із тридцяти двох текселів не зберігає свого власного кольору - кожен тексель зберігає лише інформацію про те, як поєднуватися між двома кольорами RGB свого блоку 8х4-тексель.

Якщо в вихідному зображенні є текстовий блок 8х4 з веселкою в ньому 32 кольори, компресія PVRTC 2BPP виконає дуже погану роботу з підтримання його якості, оскільки в PVRTC 2BPP кожен текстовий блок 8х4 має лише два кольори RGB, які можна поєднувати.


Захоплююче! Велике спасибі. На жаль, у мене виникають багато проблем із завантаженням паперу, на який ви пов’язані. Може бути, він розміщений на EC2 Amazon? ;)
Тоджі

6

Стиснення текстури не стискає пікселів. Він стискає блоки пікселів. Коли на нього посилається окремий піксель, GPU обчислює, який блок представляє піксель. Потім він обробляє весь блок, щоб отримати колір цього пікселя.

Приклад

Припускаємо, що розмір блоку становить 4х4 пікселя на текстурі RGB. Без стиснення кожен блок споживає 4x4x3 = 48байти в пам'яті текстури.
Тепер алгоритм стиснення обчислить середнє значення для кожного каналу (RGB) і збереже його з блоком (3 байти). Тепер давайте кожному пікселю давати по 2 біти для регулювання середнього рівня, щоб піксель був ближче до його початкового кольору. Це ще один 4x4x2x3/8 = 12байт.
Загальна кількість байтів, що використовуються цим недавно винайденим компресором, становить 15 байт на блок, коефіцієнт стиснення 31,25%.

Міфічний компресор використовує 7,5 bpp. Це не так добре, як може досягти pvrtc з 2 bpp, але тепер у вас є приблизне уявлення про те, як можна досягти 2 bpp.

оновлення:
Я щойно переглянув сторінку wikipedia для pvrtc . Схоже, pvrtc не використовує традиційне блокування стиснення. Ось документ, який описує спосіб компресії на основі блоку та те, як відрізняється pvrtc. Зокрема, зверніть увагу: Блокові фільтри можуть створювати пристойні зображення, використовуючи 4bpp (без альфа), тоді як nvrtc може це робити з 2bpp.


1

@Toji, сайт, на якому розміщено документ, трохи темпераментний, але він працював для мене сьогодні вранці. Якщо цього немає, якщо у вас є доступ до ACM / SIGGRAPH, він розміщений тут . Як не дивно, це було також на веб-сайті розробників IMG / PowerVR (безкоштовна реєстрація), але я не можу знайти потрібний розділ. :-(

[UPDATE] Він все ще знаходиться на сайті IMG тут [/ UPDATE]

@bmcnet: PVRTC не розбиває текстуру на блоки, наприклад, ETC або S3TC. FWIW, я експериментував із текстурами на основі блоків, але не зміг знайти спосіб упакувати достатню кількість даних у автономні блоки та все-таки отримати потрібні результати. Натомість це трохи більше "глобальної" системи стиснення текстури. Він має 2 зображення низької роздільної здатності, які білінеарно збільшує масштаб до цільової здатності, а потім змішує їх разом на основі текстового тексту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.