Jak, u licha, dostajesz przyzwoity kolor z 2BPP?


11

Przyglądałem się teksturom PowerVR i natknąłem się na kilka tekstur, które najwyraźniej mają 2 bity na piksel. Szczerze mówiąc, to mnie denerwuje. Jak uzyskać nawet w połowie przyzwoitą ochronę kolorów, gdy masz tylko 4 możliwe stany na pi na piksel? Bardzo chciałbym znaleźć wszelkie zasoby, które mówią o kompresji stojącej za takim wyczynem. Dzięki!


Dzięki JPG możesz uzyskać przyzwoity kolor za mniej niż 1BPP :)
Ivan Kuckir

Odpowiedzi:


13

Kodowanie PVRTC 2BPP, wprowadzone w tym dokumencie, dzieli obraz na bloki 8x4-texel i kompresuje każdy blok tak, że dla każdego trzydziestu dwóch bloków texel są przechowywane tylko dwa kolory RGB.

Żaden z trzydziestu dwóch tekstur nie przechowuje własnego koloru - każdy tekst przechowuje tylko informacje o tym, jak mieszać dwa kolory RGB swojego bloku 8x4-texel.

Jeśli obraz źródłowy ma blok tekstylny 8x4 z tęczą 32 kolorów, kompresja PVRTC 2BPP bardzo źle utrzyma swoją jakość, ponieważ w PVRTC 2BPP każdy blok tekstylny 8x4 ma tylko dwa kolory RGB do zmieszania.


Fascynujący! Dziękuję Ci bardzo. Niestety mam problem z załadowaniem papieru, z którym się łączysz. Może jest hostowany na EC2 Amazon? ;)
Toji,

6

Kompresja tekstur nie kompresuje pikseli. Kompresuje bloki pikseli. Kiedy odwołuje się do pojedynczego piksela, GPU oblicza, który blok reprezentuje piksel. Następnie przetwarza cały blok, aby uzyskać kolor tego piksela.

Przykład

Załóżmy, że rozmiar bloku to 4x4 pikseli na teksturze RGB. Bez kompresji, każdy blok zużywa 4x4x3 = 48bajty w pamięci tekstur.
Teraz algorytm kompresji obliczy średnią dla każdego kanału (RGB) i zapisze go z blokiem (3 bajty). Teraz dajmy każdemu pikselowi 2 bity, aby dostosować średnią, tak aby piksel był bliżej pierwotnego koloru. To kolejne 4x4x2x3/8 = 12bajty.
Całkowita liczba bajtów wykorzystywanych przez tę nowo wynalezioną sprężarkę wynosi 15 bajtów na blok, a współczynnik kompresji wynosi 31,25%.

Mój mityczny kompresor zużywa 7,5 pz. To nie jest tak dobre, jak można osiągnąć za pomocą 2 pb pvrtc, ale teraz masz przybliżony pomysł, w jaki sposób można osiągnąć 2 pz.

aktualizacja:
Właśnie obejrzałem stronę wikipedia dla pvrtc . Wygląda na to, że pvrtc nie używa tradycyjnej kompresji opartej na blokach. Oto artykuł opisujący sposób działania kompresji opartej na blokach i różnice między pvrtc. Szczególna uwaga: filtry oparte na blokach mogą tworzyć przyzwoicie wyglądające obrazy przy użyciu 4bpp (bez alfa), podczas gdy nvrtc może to zrobić przy 2bpp.


1

@Toji, strona, na której jest ten papier, jest nieco temperamentna, ale zadziałało dla mnie dziś rano. W przeciwnym razie, jeśli masz dostęp do ACM / SIGGRAPH, jest on hostowany tutaj . O dziwo było to również na stronie programisty IMG / PowerVR (darmowa rejestracja), ale nie mogę znaleźć odpowiedniej sekcji. :-(

[AKTUALIZACJA] Jest jeszcze na miejscu IMG tutaj [/ UPDATE]

@bmcnet: PVRTC nie rozbija tekstury na bloki, np. ETC lub S3TC. FWIW, eksperymentowałem z teksturami opartymi na blokach, ale nie mogłem znaleźć sposobu na spakowanie wystarczającej ilości danych w samodzielne bloki i nadal uzyskać pożądane wyniki. Zamiast tego jest to bardziej „globalny” system kompresji tekstur. Ma 2 obrazy o niskiej rozdzielczości, które dwuliniowo skaluje do rozdzielczości docelowej, a następnie miesza je ze sobą na zasadzie texel-by-texel.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.