DXT1 Kompression

Was ist DXT1?

DXT1 ist ein Format zur Speicherung von Texturen und ist Teil der Familie S3TC, also DXT1 bis DXT5. Die Daten werden verlustbehaftet komprimiert mit dem Ziel im Vergleich zu RGB888 83,3% Speicherplatz auf dem VRAM der Grafikarte zu sparen. Erst 2018 lief das Patent des Algorithmus von S3 Graphics aus, nachdem es am 2. Oktober 2017 zu letzt für weitere 165 Tage verlängert wurde. Das originale Patent1 wurde am 10. August 2004 zugelassen. Vor allem damals war der Grafikspeicher sehr begrenzt. Die GT 6800 von NVIDIA2 für damalige 400€3, also heute etwa 506,83€ brachte gerade einmal 256MB GDDR3 Speicher mit.

Funktionsweise

  1. Das Bild wird im ersten Schritt in 4x4 Pixel große Blöcke aufgeteilt. Bilder, welche nicht genau zerteilbar sind, werden der Spezifikation nach nicht unterstützt. Es ist in diesem Fall allerdings möglich Bilder dessen Masse nicht x % 4 == 0 entsprechen, abzuschneiden oder aufzufüllen.
  2. Aus jedem Block werden zwei Farben gewählt, um eine vier farbige Pallette zu interpolieren. Wenn die Farben mit dem größeren Wert als Integer vorne steht, wird nur zwischen 3 Farben interpoliert und der 4. Zustand wird für Transparenz genutzt. Pro Farbe der Palette werden allerdings nur zwei Byte, also RGB565 verwendet. Da meist Pixel in der gleichen Umgebung sehr ähnliche Farben haben, reicht die geringe Vielfalt der Palette aus.
  3. Jeder Pixel in dem Block, also den 4x4 Pixeln, wird auf die nächste Farbe gesetzt. Da die Palette nur vier Farben beinhaltet, kann dann pro Pixel die Farbe mit zwei Bits ausgedrückt werden. Der Block nutzt also vorher 16 * 3 Bytes = 48 Bytes zu nun 2 * 2 Byte + 16 * 2 Bit = 8 Bytes.
  4. Die Ergebnisse aller Blöcke werdem im letzten Schritt hintereinander geschrieben.

Vielleicht sind Ihnen bei den Rechnungen bereits noch die weiteren Vorteile aufgefallen: Es ist immer bereits vor der Kompression bekannt, wie groß dass Ergebnis ist, nämlich 1/6 des Originals. Da alle Blöcke nun auch hintereinander liegen, ist es also einfach möglich, mit einer trivialen Verschiebungsrechnung die Adresse jedes einzelnen Pixels zu ermitteln. (⌊x / 4⌋ + ⌊y / 4⌋ * (Breite / 4)) * 8. Natürlich muss dafür außerdem die Palette berechnet werden.

Vorher / Nachher Bild

Beispiel Bild

Zu sehen ist ein 4x4 Pixel Block vor und nach der Kompression. Zu erkennen ist, dass die Details leicht verloren gehen, das Bild aber noch deutlich erkennbar ist. Auch zu sehen ist, dass pro Block nur vier Farben verwendet werden.

Beispiel Bild Vorher
Beispiel Bild Vorher
Beispiel Bild Nachher
Beispiel Bild Nachher

Zierhut IT Favicon

Am Beispiel des Logos erkennt man nun also, dass trotz nur zwei gespeicherten Farben pro Block, das Bild optisch sehr gut aussieht, obwohl es nur noch 16,67% der Originalgröße hat.

Zierhut IT Favicon Vorher
Zierhut IT Favicon Vorher
Zierhut IT Favicon Nachher
Zierhut IT Favicon Nachher

Verwendung in Spielen

In der Source Engine wird dieses Format innerhalb von VTF (Valve Texture File4) Dateien verwendet. Andere Spiele wie der Microsoft Flight Simulator5 nutzen ebenfalls diesen Algorithmus. Inzwischen ist DXT1 sehr verbreitet und Bestandteil von OpenGL6, WebGL7, Vulkan8 und DirectX9 Implementationen.


  1. US 6775417 Patent ↩︎

  2. NVIDIA GeForce 6800 GT auf Techpowerup.com ↩︎

  3. NVIDIA GeForce 6800 GT auf GameStar ↩︎

  4. Valve Texture File ↩︎

  5. Microsoft Flight Simulator DXT Kompression ↩︎

  6. OpenGL Implementation ↩︎

  7. WebGL Implementation ↩︎

  8. Vulkan Implementation ↩︎

  9. DirectX Implementation ↩︎