21. Oktober 2025

KTX2-Texturkomprimierung

Texturen sind in modernen Grafikanwendungen allgegenwärtig. Sie liefern Farb- und Materialinformationen für unsere Modelle.

Je höher die Auflösung einer Textur, desto mehr Details erhalten wir. Hochauflösende Kameras werden heute immer zugänglicher und günstiger. Das hat jedoch seinen Preis: den Speicherverbrauch.

Komprimierte Bildformate wie JPEG und PNG reduzieren den Speicherbedarf von Bildern auf dem Datenträger. Diese Formate sind auch für Webanwendungen hilfreich, da sich die über das Netzwerk zu übertragende Datenmenge verringert und damit die Ladezeiten von Seiten sinken. Formate wie JPEG können von der Grafikkarte (GPU) jedoch nicht interpretiert werden; sie sind ausschließlich für die Bildkomprimierung gedacht, nicht für das Rendering. Ein JPEG-Bild müsste dekomprimiert werden, bevor es zum Rendern an die GPU gesendet wird.

Das folgende Bild hat eine Größe von 256×256.

Erstellt mit GIMP

Als JPEG in hoher Qualität komprimiert, ist es 53,5 KB groß.

Sobald wir das Bild für die GPU nach RGBA8 dekomprimieren, belegt es 256 KB. Das ist etwa das Fünffache!

Dies ist ein sehr kleines Bild. Ein 4K-Bild (heute sehr verbreitet) würde dagegen beispielsweise 64 MB belegen. Große Anwendungen enthalten viele Ressourcen, darunter Texturen. Das summiert sich schnell und kann den gesamten GPU-Speicher (VRAM) aufbrauchen – vor allem auf leistungsschwachen Geräten wie Smartphones, Tablets und VR-Geräten.

Texturkomprimierungsformate wurden entwickelt, um Bilder in der GPU komprimiert vorhalten zu können. Sie sind auf die Architektur von GPUs zugeschnitten, um eine optimale Performance zu erzielen. Das bedeutet nicht nur einen geringeren VRAM-Verbrauch, sondern auch:

  • Kürzere Ladezeiten, da weniger Daten an die GPU übertragen werden müssen.
  • Höhere Bildraten, da die Anforderungen an die interne Übertragungsbandbreite sinken.

Verschiedene GPU-Hersteller haben in Zusammenarbeit mit den wichtigsten Akteuren unterschiedliche Texturkomprimierungsformate entwickelt. Einige Beispiele für diese Formate sind:

  • Die BC-Formatfamilie (auch als S3TC bekannt), etwa BC1, BC3, BC6H und BC7 (unter anderem). Diese Formate sind Desktop-Plattformen vorbehalten.
  • Die ETC-Familie (Ericsson Texture Compression), bestehend aus ETC1, ETC2, ETC2_EAC und EAC. Diese Formate wurden vor allem von OpenGL übernommen und kommen auf Android- und WebGL-Plattformen zum Einsatz.
  • PVRTC ist eine Formatfamilie, die ausschließlich für PowerVR-Chips verfügbar ist. Sie war wichtig, weil sie das einzige unterstützte Format unter iOS war. Inzwischen ist sie im Begriff zu veralten, da Apple für alle Geräte auf ASTC umstellt.
  • ASTC ist das derzeit fortschrittlichste Texturkomprimierungsformat. Es handelt sich um einen von der Khronos Group entwickelten Standard, der sich inzwischen als De-facto-Format für Mobilgeräte etabliert hat.

Wie Sie sich vorstellen können, bereitet diese Vielzahl an Texturkomprimierungsformaten Anwendungsentwicklern, denen eine gute Performance auf mehreren Plattformen wichtig ist, erhebliches Kopfzerbrechen.

Die Khronos Group versucht, diese Fragmentierung mit dem Containerformat KTX2 und den Superkomprimierungsverfahren zu lösen. Wir sehen uns diese in den folgenden Abschnitten genauer an.

KTX1

Wie Sie sich vielleicht schon gedacht haben, gab es vor KTX2 bereits KTX1.

KTX1 war ein sehr einfaches Containerformat für Bilder – also lediglich ein Format, das Bilder enthält, die wiederum in unterschiedlichen Formaten vorliegen können. Es konnte jedes der oben genannten komprimierten Texturformate sowie unkomprimierte RGBA-Bilder enthalten. Es ist einfach und funktioniert.

Das Problem: Wollte man viele Plattformen unterstützen, musste der KTX1-Container die Bilder in den jeweils plattformspezifischen Formaten enthalten. Das ist schwer zu pflegen und bedeutet, dieselben Informationen in jedem Format zu speichern (die Dateien werden größer).

KTX2

KTX2 geht die Fragmentierung mit transcodierbaren Formaten und Superkomprimierungsverfahren noch weiter an.

Zusätzlich zu den von KTX1 unterstützten Bildformaten bietet KTX2 zwei transcodierbare Formate: Universal ASTC (UASTC) und ETC1S. Diese Formate sind dafür ausgelegt, in die plattformspezifischen Texturkomprimierungsformate umgewandelt zu werden. Die Umwandlung dieser sogenannten transcodierbaren Formate in die Texturkomprimierungsformate erfolgt extrem schnell, sodass sie problemlos zur Laufzeit durchgeführt werden kann (dieser Vorgang wird als Transcodierung bezeichnet).

Darüber hinaus unterstützt KTX2 Superkomprimierungsverfahren. Diese Technik komprimiert transcodierbare Formate auf dem Datenträger zusätzlich. Damit lassen sich KTX2-Dateien erzeugen, die ähnlich groß wie JPEG-Dateien oder manchmal sogar kleiner sind.

[Bild von https://www.khronos.org/ktx/]

 

So konvertieren Sie Bilder in KTX

Um Ihre Bilder in KTX zu konvertieren, können Sie die offiziellen Kommandozeilentools von KTX-Software verwenden.

Sie können die Kommandozeilentools aus dem Quellcode kompilieren. Am einfachsten ist es jedoch, das Installationsprogramm im Bereich Releases herunterzuladen.

Achten Sie während der Installation darauf, dass das Kontrollkästchen „Command line tools“ aktiviert ist.

Im Installationsordner finden Sie das benötigte Tool: toktx.exe.

Grundlegender Befehl:

toktx.exe –encode uastc –zcmp 15 –genmipmap output.ktx input.jpg

 

–zcmp: legt die Komprimierungsstufe auf dem Datenträger fest.

–genmipmap: Die vollständige Mipmap-Kette wird erzeugt und in der KTX-Datei gespeichert. Das ist empfehlenswert, da das Erzeugen der Mipmap-Kette komprimierter Texturen aufwendig ist und daher nicht zur Laufzeit erfolgen sollte.

Eine weitere interessante Option ist –uastc_quality, mit der Sie das Verhältnis zwischen Qualität und Komprimierungsgeschwindigkeit feinabstimmen können.

toktx.exe –encode uastc –zcmp 15 –genmipmap –uastc_quality 3 output.ktx input.jpg

 

toktx bietet zahlreiche Optionen, die Sie sich unbedingt ansehen sollten:

toktx.exe –help

 

Benchmarks

Als einfaches Beispiel verwenden wir eine einfache Kugel mit einem PBR-Material.

Wir haben zwei identische Materialien erstellt, mit dem einzigen Unterschied, dass eines JPG-Bilder und das andere KTX-Bilder verwendet.

Wie Sie sehen, senkt KTX den VRAM-Verbrauch drastisch. Die vier Bilder belegen mit JPG insgesamt 128 MB VRAM, mit KTX dagegen nur 32 MB. Die Qualität des Endbildes ist vergleichbar; einen Unterschied werden Sie nicht bemerken.

Außerdem scheint KTX bei den meisten Bildern weniger Speicherplatz auf dem Datenträger zu belegen als JPG, auch wenn das nicht immer der Fall sein muss.

Für diesen Test haben wir die JPG-Bilder mit dem offiziellen Kommandozeilentool „toktx“ in KTX konvertiert. Die beste Parameterkombination für dieses Tool zu finden, ist eine Kunst, da man Kompromisse abwägen muss. Ermitteln Sie die passendsten Parameter für die Bilder Ihrer Anwendung unter Berücksichtigung der Anforderungen an Qualität und Performance. Normal Maps erfordern beispielsweise in der Regel mehr Genauigkeit als Farb-Maps.

Diese Parameter haben wir für das vorherige Beispiel verwendet:

Farbe:

& ‘C:\Program Files\KTX-Software\bin\toktx.exe’ –encode uastc –genmipmap –assign_oetf srgb –target_type RGB –uastc_quality 3 –uastc_rdo_l 4 –zcmp 20 .\Ktx\Bricks_color.ktx .\Jpg\Bricks_color.jpg

 

Normalen:

& ‘C:\Program Files\KTX-Software\bin\toktx.exe’ –encode uastc –genmipmap –assign_oetf linear –target_type RGB –normalize –uastc_quality 3 –uastc_rdo_l 0.5 –zcmp 20 .\Ktx\Bricks_normals.ktx .\Jpg\Bricks_normals.jpg

 

PBR:

& ‘C:\Program Files\KTX-Software\bin\toktx.exe’ –encode uastc –genmipmap –assign_oetf linear –target_type RG –uastc_quality 3 –uastc_rdo_l 1 –zcmp 20 .\Ktx\Bricks_pbr.ktx .\Jpg\Bricks_pbr.jpg

 

AO:

& ‘C:\Program Files\KTX-Software\bin\toktx.exe’ –encode uastc –genmipmap –assign_oetf linear –target_type R –uastc_quality 3 –uastc_rdo_l 4 –zcmp 20 .\Ktx\Bricks_AO.ktx .\Jpg\Bricks_AO.jpg

 

KTX in Evergine

Mit Evergine 2025.10 haben wir die Unterstützung für KTX1 und KTX2 sowie für alle plattformspezifischen komprimierten Texturformate hinzugefügt.

Das ist eine großartige Nachricht für alle Anwendungen, insbesondere aber für Webanwendungen, da sich die Ladezeiten dadurch erheblich verbessern lassen.

Sie können Ihre Grafikanwendungen jetzt mit minimalem Aufwand optimieren: Alles ist nahtlos in die Engine integriert und sehr benutzerfreundlich.

KTX2-Dateien lassen sich im Editor wie jedes andere Bildformat importieren und in Materialien verwenden. Die Dateiendung muss „.ktx“ oder „.ktx2“ lauten.

Evergine.ImageRuntime wurde erweitert und kann nun KTX2-Dateien laden.

Wenn Ihre GLTF-Dateien KTX-Bilder enthalten (eingebettet oder referenziert), funktioniert alles sofort.

Autor
Alejandro Juan Pérez
Plain Concepts Research