Wie um alles in der Welt bekommt man von 2BPP eine anständige Farbe?

11

Ich habe mich mit PowerVR-Texturen befasst und bin auf mehrere Texturen gestoßen, die anscheinend 2 Bit pro Pixel haben. Das verwirrt mich ehrlich gesagt. Wie kommt man zu einer halbwegs anständigen Farbkonservierung, wenn man nur 4 mögliche Zustände pro Pi pro Pixel hat? Ich würde alle Ressourcen lieben, die über die Komprimierung hinter einer solchen Leistung sprechen. Vielen Dank!

Toji
quelle
Mit JPG können Sie eine anständige Farbe mit unter 1BPP erhalten :)
Ivan Kuckir

Antworten:

13

Die in diesem Dokument vorgestellte PVRTC 2BPP-Codierung unterteilt ein Bild in 8x4-Texel-Blöcke und komprimiert jeden Block so, dass nur zwei RGB-Farben für jeden 32-Texel-Block gespeichert werden.

Keines der zweiunddreißig Texel speichert eine eigene Farbe - jedes Texel speichert nur Informationen darüber, wie zwischen den beiden RGB-Farben seines 8x4-Texel-Blocks gemischt werden kann.

Wenn das Quellbild einen 8x4-Texelblock mit einem Regenbogen von 32 Farben enthält, kann die PVRTC 2BPP-Komprimierung die Qualität nur sehr schlecht beibehalten, da in PVRTC 2BPP jeder 8x4-Texelblock nur zwei RGB-Farben enthält, mit denen gemischt werden kann.

bmcnett
quelle
Faszinierend! Vielen Dank. Leider habe ich große Probleme beim Laden des Papiers, mit dem Sie verlinkt haben. Vielleicht ist es auf Amazon EC2 gehostet? ;)
Toji
6

Die Texturkomprimierung komprimiert keine Pixel. Es komprimiert Pixelblöcke. Wenn auf ein einzelnes Pixel verwiesen wird, berechnet die GPU, welcher Block das Pixel darstellt. Dann verarbeitet es den gesamten Block, um die Farbe dieses Pixels zu erhalten.

Ein Beispiel

Nehmen wir an, dass die Blockgröße bei einer RGB-Textur 4 x 4 Pixel beträgt. Unkomprimiert verbraucht jeder Block 4x4x3 = 48Bytes im Texturspeicher.
Jetzt berechnet der Komprimierungsalgorithmus den Durchschnitt für jeden Kanal (RGB) und speichert ihn mit dem Block (3 Bytes). Geben Sie nun jedem Pixel 2 Bits, um den Durchschnitt so anzupassen, dass das Pixel näher an seiner ursprünglichen Farbe liegt. Das ist noch ein 4x4x2x3/8 = 12Byte.
Die Gesamtbytes, die von diesem neu erfundenen Kompressor verwendet werden, betragen 15 Bytes pro Block, ein Kompressionsverhältnis von 31,25%.

Mein mythischer Kompressor verbraucht 7,5 bpp. Das ist nicht so gut wie das 2 bpp pvrtc erreichen kann, aber jetzt haben Sie eine ungefähre Vorstellung davon, wie 2 bbp erreicht werden könnten.

Update:
Ich habe mir gerade die Wikipedia-Seite für pvrtc angesehen . Es sieht so aus, als ob pvrtc keine herkömmliche blockbasierte Komprimierung verwendet. In diesem Artikel wird beschrieben, wie die blockbasierte Komprimierung funktioniert und wie sich pvrtc unterscheidet. Besonders zu beachten: Blockbasierte Filter können mit 4bpp (kein Alpha) anständig aussehende Bilder erzeugen, während nvrtc dies mit 2bpp kann.

deft_code
quelle
1

@Toji, die Seite, auf der sich das Papier befindet, ist ein bisschen temperamentvoll, aber es hat heute Morgen für mich funktioniert. Andernfalls wird es hier gehostet, wenn Sie Zugriff auf ACM / SIGGRAPH haben . Seltsamerweise es war auch auf der IMG / PowerVR Entwickler - Website (kostenlose Registrierung) , aber ich kann nicht den richtigen Abschnitt zu finden scheinen. :-(

[UPDATE] Es ist immer noch auf der IMG-Seite hier [/ UPDATE]

@bmcnet: PVRTC zerlegt die Textur nicht in Blöcke wie beispielsweise ETC oder S3TC. FWIW, ich habe mit blockbasierten Texturen experimentiert, aber ich konnte keine Möglichkeit finden, genügend Daten in in sich geschlossene Blöcke zu packen und trotzdem die gewünschten Ergebnisse zu erzielen. Stattdessen handelt es sich eher um ein "globales" Texturkomprimierungssystem. Es verfügt über 2 Bilder mit niedriger Auflösung, die bilinear auf die Zielauflösung hochskaliert und diese dann texelweise miteinander gemischt werden.

Simon F.
quelle