Kompresja/dekompresja DXT1

0

Staram się zaimplementować kodek DXT1, który niby jest prosty w implementacji jednak ja mam z nim problem.
Skrócony opis jest tutaj http://en.wikipedia.org/wiki/S3_Texture_Compression
Znalazłem w necie także coś takiego:
user image
Rozumiem, że z obrazka biorę blok pikseli 4x4 i tu zaczynają się schody.

  1. Czy color_0 i color1 są po prostu brane jako pierwsze elementy tablicy bloku ?
  2. Czy color_0 i color1 są wyszukiwane jako dwa o skrajnych wartościach w tablicy bloku ?
0

Z tego co rozumiem, a pierwszy raz to widzę na oczy, dostajesz dwa 16-bitowe kolory i dwubitową macierz 4x4, za pomocą której wypełniasz kwadrat 4x4 pikseli.

Bity w macierzy określają, w jakich stosunkach dwa źródłowe kolory trzeba wymieszać dla danego piksela.

0

Nie wiem w jaki sposób znaleźć te dwa 16 bitowe kolory :(

Ogólnie to szukam w miarę prostego dekodera wideo, który mógłbym zaimplementować na mikrokontroler i pościć w rozdzielczości 320x240 pikseli.

0

Przecież masz narysowane na obrazku:

  • "total 64 bits", a więc każdy blok 4x4 to 64 bity w skompresowanym ciągu,
  • 64 bity składają się z 16 bitów na color0, 16 bitów na color1 i 32 bitów na macierz,
  • na każdy element macierzy przypadają 2 bity i wszystko się zgadza bo 16 elementów * 2 bity/ element = 32 bity,

Jeśli chodzi o kompresję to musisz albo znaleźć gotowe heurezy do znajdowania dobrych wartości color0 i color1 albo sam szukać. W zależności od tego jak oceniasz jakość skompresowanego obrazu, procedura szukania color0 i color1, a także współczynników w macierzy będzie wyglądać inaczej.

Np wymyślona na szybko heureza:

  • color0 będzie uśrednioną wartością 3 najciemniejszych pikseli z bloku,
  • color1 analogicznie tylko dla najjaśniejszych 3,
  • wartości w macierzy będą dobrane tak, by różnica jasności między wartościami oryginalnymi, a odtworzonymi była jak najmniejsza,

Wzór na jasność, czyli luminancję, możesz wziąć np stąd: http://en.wikipedia.org/wiki/YCbCr - to co ciebie interesuje to wzory na Y.

16 bitów na kolor może być (tzn strzelam) podzielone np tak, że jest 5 bitów na kanał czerwony, 6 bitów na zielony i 5 bitów na niebieski. Ale może być też inaczej, zajrzyj do specyfikacji DXT1.

1 użytkowników online, w tym zalogowanych: 0, gości: 1