BC7-Textur mit Alpha hat die gleiche Größe wie BC7 ohne Alpha

Also habe ich eine Textur erstellt. Ich habe die RGB-Textur mit BC7-Komprimierung gespeichert. Anschließend wurde der Alpha-Kanal [Spiegelkarte] mit unterschiedlichen Graustufen hinzugefügt und die Datei erneut als RGBA mit BC7-Komprimierung gespeichert. Die resultierende Datei hat die gleiche Größe wie die ohne Alpha, enthält jedoch zusätzliche Informationen – Alpha-Kanal. Wie ist das möglich? Sie können keinen Kuchen haben und keinen Kuchen essen, wie ich verstehe. Gibt es also Kompromisse, um die gleiche Größe sicherzustellen?

Ich verwende Photoshop mit dem Intel DDS-Plugin.

Antwort

BC7 codiert immer effektiv 4 Kanäle. Dies liegt in der Natur des Formats. Das Aktivieren von Alpha bedeutet, dass der Kompressor den Alpha-Wert in Ihrem Quellbild liest und verwendet, aber das ist alles.

Alle BC7-komprimierten Bilder einer bestimmten Dimension haben dieselbe Größe, da BC7 jedes 4×4 komprimiert Gruppe von Texeln in 128-Bit. Dies bedeutet jedoch nicht, dass sie dieselbe Qualität haben.

BC7 ist ein adaptives Codierungsformat. Während jeder Block eine feste Größe hat (sowohl räumlich als auch bitweise), speichert jeder Block, wie viele Kanäle dieser Block tatsächlich komprimiert und wie sie miteinander korrelieren. Die -Spezifikationen sind komplex , aber der allgemeine Vorteil ist, dass der Kompressor pro Block herausfindet, welche Art der Komprimierung für einen bestimmten Block am besten funktioniert. Wenn der Kompressor einen Block betrachten und feststellen kann, dass das Alpha für alle Texel 1,0 beträgt, kann er mehr Bits der 128 Bits für die Farben und weniger für das Alpha ausgeben.

Als solches eine Textur " ohne Alpha " ist genau wie eine Textur mit Alpha, bei der jedes Texel ein Alpha von 1 hat. Diese Blöcke geben den größten Teil aus Bits in den Nicht-Alpha-Teilen der Texel, wobei nur wenige Bits in einem " -Modus " -Feld verschwendet werden, das den Dekomprimierer darüber informiert Das Alpha ist eine Konstante 1.0.

Dies bedeutet auch, dass BC7 diese konstanten Alpha-Bereiche mit weniger Bits codieren kann, wenn Ihre Textur ein variierendes Alpha hat, Teile davon jedoch ein konstantes Alpha haben, so dass mehr Bits können für eine verbesserte Farbcodierung ausgegeben werden.

Sie sollten also nicht das Gefühl haben, dass ein Problem vorliegt, da die beiden Komprimierungsschalter mit der gleichen Anzahl von Bytes ausgegeben wurden.

Antwort

Hier ist ein ar Artikel über das BCn-Format: klick mich . Es wurde von Nathan Reed geschrieben, der auf dieser Seite ziemlich aktiv ist. Also wird er wahrscheinlich vorbeikommen und Ihre Frage mit weiteren Details beantworten, obwohl ich denke, dass der Artikel alles erklären wird, was Sie wissen müssen.

Der relevanteste Teil für Ihre Frage scheint dieser Abschnitt aus dem zu sein Artikel:

BC steht für „Blockkomprimierung“, und die BCn-Formate arbeiten alle in Bezug auf 4 × 4 Pixelblöcke. Alle Bilder werden in diese kleinen Blöcke aufgeteilt, und jeder Block ist in sich geschlossen – die zu decodierenden Daten befinden sich alle in einem zusammenhängenden Block im Speicher . Darüber hinaus ist die Größe jedes komprimierten Blocks festgelegt – entweder 8 oder 16 Byte , je nachdem, welches BCn-Format verwendet wird. Dies entspricht einem Komprimierungsverhältnis von 4: 1 oder 8: 1, wenn das Quellbild im 8-Bit-RGBA-Format vorliegt.

Solange Ihr Pixel Anzahl ändert sich nicht, die Größe der Textur ändert sich auch nicht. Je mehr Kanäle Sie verwenden (nur 3 und 4 werden von BC7 gemäß der Microsoft-Dokumentation unterstützt), desto weniger Informationen können Sie pro Farbkanal in a speichern Block. Dies bedeutet, dass Sie aufgrund der Komprimierung mehr Informationen verlieren, wenn Sie RGBA anstelle von RGB verwenden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.