Kompresja/dekompresja DXT1

Odpowiedz Nowy wątek
2014-12-20 10:54
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 ?

Pozostało 580 znaków

2014-12-20 11:19
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.

Pozostało 580 znaków

2014-12-20 13:18
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.

Pozostało 580 znaków

2014-12-20 15:21
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.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 5x, ostatnio: Wibowit, 2014-12-20 15:28

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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