Leitfaden für Einsteiger
Was mit einer Textur in der GPU passiert
Ein 300 KB großes PNG kann unbemerkt 5 MB Grafikspeicher belegen. Dieser Leitfaden zeigt, warum das so ist, wie GPUs Texturen mit Blockkompression verkleinern und wie du ein Format auswählst. Zu jeder Idee gibt es etwas zum Ausprobieren.
Kapitel 1
Dateigröße ist nicht Speichergröße
PNG und JPEG sind zum Speichern und Versenden von Bildern gedacht. Bevor die GPU eine Textur zeichnen kann, wird das Bild in rohe Texel entpackt, meist 4 Byte pro Texel.
Die GPU tastet diese Texel millionenfach pro Frame ab, deshalb müssen sie jederzeit lesbar sein. Der Speicherbedarf hängt also nur von Auflösung und Pixelformat ab, nicht davon, wie gut die Datei komprimiert war. Mipmaps, die verkleinerten Kopien für entfernte Flächen, kommen mit rund einem Drittel dazu.
- RGBA832 Bit pro Texel213 MiBReferenz21,3 MiB pro Textur
- BC7 · ASTC 4×48 Bit pro Texel53,3 MiB4× kleiner5,3 MiB pro Textur
- BC1 · ETC2 RGB4 Bit pro Texel26,7 MiB8× kleiner2,7 MiB pro Textur
- ASTC 6×63,56 Bit pro Texel23,8 MiB9× kleiner2,4 MiB pro Textur
- ASTC 8×82 Bit pro Texel13,3 MiB16× kleiner1,3 MiB pro Textur
- ASTC 12×120,89 Bit pro Texel6 MiB35,7× kleiner612 KiB pro Textur
Blockformate werden auf jeder Mip-Stufe auf ganze Blöcke aufgerundet, die Werte entsprechen also dem, was die GPU tatsächlich reserviert.
Kapitel 2
Warum die GPU keine PNGs behalten kann
Wenn ein Shader eine Textur abtastet, kann er jedes beliebige Texel in beliebiger Reihenfolge anfordern. Die Hardware muss es sofort finden.
PNG und JPEG nutzen Codierung mit variabler Länge: Um ein Pixel in der Mitte zu erreichen, muss alles davor decodiert werden. GPU-Formate haben dagegen eine feste Rate: Jeder 4×4-Block belegt genau gleich viele Bytes, also ist die Adresse jedes Texels eine einfache Multiplikation. Die Textur bleibt im Speicher komprimiert, und die Textureinheit decodiert die Blöcke beim Lesen.
Mit den Pfeiltasten verschiebst du die Auswahl.
- Ausgewähltes Texel
- x 13, y 18
- Sein Block
- Spalte 3, Zeile 4
- Adresse in BC1
- (4 × 8 + 3) × 8 Byte = Byte 280
Die 64 Blöcke, wie sie im Speicher liegen
Dasselbe Texel in einem PNG
Zuerst die Zeilen 0 bis 18 entpacken (19 von 32)
Kapitel 3
Ein 4×4-Block von innen
BC1, das älteste weit verbreitete Format, zeigt das Prinzip am deutlichsten. Es speichert einen Block aus 16 Texeln in nur 8 Byte.
Der Encoder wählt zwei Endpunktfarben. Der Decoder mischt daraus vier Farben auf einer Geraden, und jedes Texel speichert eine 2-Bit-Nummer, die auf die nächstgelegene zeigt. Blöcke mit sanften Farbverläufen bleiben gut erhalten, Blöcke mit mehreren unabhängigen Farben nicht.
Kapitel 4
Viele Formate, unterschiedliche Kompromisse
Neuere Formate nutzen ihre Bits geschickter als BC1: mehr Endpunkte, mehrere Farblinien pro Block, besseres Alpha oder wählbare Blockgrößen.
BC7 und ASTC 4×4 nutzen 8 Bit pro Texel und sehen dem Original sehr ähnlich. ASTC tauscht über die Blockgröße Qualität gegen Größe: Ein Block hat immer 128 Bit, ein 12×12-Block kostet also weniger als ein Bit pro Texel. Basis Universal geht einen anderen Weg: Es liefert eine kompakte Datei aus und transcodiert sie auf dem Gerät in ein Format, das diese GPU unterstützt.
| Format | Bit pro Texel | Alpha | Typische Plattformen | Geeignet für |
|---|---|---|---|---|
| BC1 | 4 | 1 Bit | Desktop, Konsolen | Deckende Farbe bei knappem Speicher |
| BC3 | 8 | Ja | Desktop, Konsolen | Farbe mit weichem Alpha in älteren Inhalten |
| BC4 | 4 | Datenkanäle | Desktop, Konsolen | Ein Kanal: Masken, Rauheit, Höhe |
| BC5 | 8 | Datenkanäle | Desktop, Konsolen | Normal Maps (X und Y) |
| BC6H | 8 | Nein | Desktop, Konsolen | HDR-Farbe wie Skyboxen und Lightmaps |
| BC7 | 8 | Ja | Desktop, Konsolen | Hochwertige Farbe, mit oder ohne Alpha |
| ETC1 | 4 | Nein | Fast alle Android-Geräte | Deckende Farbe auf sehr alten Geräten |
| ETC2 | 4–8 | Ja | Android, iOS | Breit unterstützte Mobil-Alternative |
| ASTC | 0.89–8 | Ja | Aktuelle Android- und iOS-Geräte, Apple Silicon | Einstellbare Qualität auf Mobilgeräten |
| PVRTC | 2–4 | Ja | Ältere iPhones und iPads | Nur ältere Apple-Geräte |
| Basis ETC1S | Abhängig vom Zielformat | Ja | Jede GPU, über KTX2 | Kleine Downloads, die auf jeder GPU laufen |
| Basis UASTC | Abhängig vom Zielformat | Ja | Jede GPU, über KTX2 | Hohe Qualität, die auf jeder GPU läuft |
Klicke auf „Encoder starten“, um das Beispiel zu komprimieren. Beim ersten Mal werden die Encoder geladen.
Kapitel 5
Ein Format auswählen
Zwei Fragen grenzen die Auswahl schnell ein: Welche GPUs müssen die Textur laden, und welche Art von Daten enthält sie?
Farbtexturen, Normal Maps und einkanalige Masken reagieren unterschiedlich auf Kompression, und Desktop-, Mobil- und Web-Plattformen unterstützen verschiedene Formatfamilien. Wähle deinen Fall als sinnvollen Ausgangspunkt und prüfe das Ergebnis dann mit deinen eigenen Texturen.
Starte mit
ASTC 6×6
Ebenfalls möglich: ASTC 4×4 · ETC2 RGB
ASTC läuft auf aktuellen Android- und iOS-GPUs. 6×6 ist ein guter Kompromiss; nutze 4×4 für wichtige Assets und ETC2 für ältere Geräte.
ASTC-Encoder öffnenKapitel 6
Praktische Tipps
Ein paar Gewohnheiten verhindern die meisten Probleme mit Texturkompression.
- 01
Farbe als sRGB, Daten als linear kennzeichnen
Albedo- und UI-Texturen sind sRGB. Normal-, Rauheits- und andere Datenmaps müssen linear bleiben, sonst stimmt die Beleuchtung nicht.
- 02
Normal Maps ein eigenes Format geben
Nutze Zweikanalformate wie BC5 oder EAC RG11 und rekonstruiere Z im Shader. Farbformate verschwenden Bits und erzeugen sichtbare Unebenheiten.
- 03
Mipmaps erzeugen
Sie kosten etwa 33 % mehr Speicher, verhindern aber Flimmern auf entfernten Flächen und beschleunigen das Abtasten.
- 04
Blockfreundliche Abmessungen wählen
Die meisten Formate arbeiten mit 4×4-Blöcken, durch 4 teilbare Größen vermeiden also Auffüllen. Ältere Formate wie PVRTC brauchen zusätzlich quadratische Zweierpotenzen.
- 05
Echte Inhalte auf echten Geräten prüfen
Vergleiche das decodierte Ergebnis in voller Vergrößerung mit dem Original und stelle sicher, dass deine Ziel-GPUs das Format unterstützen.
Häufige Fragen
Ist GPU-Texturkompression verlustfrei?
Nein. BC, ETC, ASTC und PVRTC sind verlustbehaftete Formate mit fester Größe pro Block. Wie viel Qualität verloren geht, hängt von Format, Blockgröße und Bild ab.
Warum nicht direkt PNG- oder JPEG-Texturen verwenden?
Sie laden schneller herunter, aber die GPU kann sie nicht abtasten. Deshalb werden sie zu rohen Texeln decodiert und belegen den vollen Speicher. GPU-Formate bleiben auch im Speicher klein.
Welches Texturformat ist das beste?
BC7 ist auf dem Desktop eine gute Standardwahl, ASTC auf aktuellen Mobilgeräten, und KTX2 mit Basis Universal, wenn eine Datei auf vielen GPUs laufen muss, etwa im Web.
Was bedeutet Bit pro Texel?
Es sind die durchschnittlichen Speicherkosten eines Texels. Rohes RGBA8 nutzt 32 Bit, BC1 4, BC7 8 und ASTC je nach Blockgröße 8 bis etwa 0,89.
Probiere es mit deinen eigenen Texturen
Alle Encoder laufen lokal in deinem Browser. Lade ein PNG oder JPEG hoch, wähle ein Format und vergleiche das Ergebnis.