Na forum 4programmers.net korzystamy z plików cookies. Część z nich jest niezbędna do funkcjonowania
naszego forum, natomiast wykorzystanie pozostałych zależy od Twojej dobrowolnej zgody, którą możesz
wyrazić poniżej. Klikając „Zaakceptuj Wszystkie” zgadzasz się na wykorzystywanie przez nas plików cookies
analitycznych oraz reklamowych, jeżeli nie chcesz udzielić nam swojej zgody kliknij „Tylko niezbędne”.
Możesz także wyrazić swoją zgodę odrębnie dla plików cookies analitycznych lub reklamowych. W tym celu
ustaw odpowiednio pola wyboru i kliknij „Zaakceptuj Zaznaczone”. Więcej informacji o technologii cookie
znajduje się w naszej polityce prywatności.
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:
Rozumiem, że z obrazka biorę blok pikseli 4x4 i tu zaczynają się schody.
Czy color_0 i color1 są po prostu brane jako pierwsze elementy tablicy bloku ?
Czy color_0 i color1 są wyszukiwane jako dwa o skrajnych wartościach w tablicy bloku ?
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.
"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,
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.