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.

Etwa 10 Minuten5 interaktive Demos
Jetzt lesen

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.

AusprobierenGrafikspeicher-RechnerÄndere Auflösung und Anzahl der Texturen und sieh, wie viel GPU-Speicher dieselben Texturen in jedem Format brauchen.
Auflösung
  • RGBA8
    32 Bit pro Texel
    213 MiB
    Referenz
    21,3 MiB pro Textur
  • BC7 · ASTC 4×4
    8 Bit pro Texel
    53,3 MiB
    4× kleiner
    5,3 MiB pro Textur
  • BC1 · ETC2 RGB
    4 Bit pro Texel
    26,7 MiB
    8× kleiner
    2,7 MiB pro Textur
  • ASTC 6×6
    3,56 Bit pro Texel
    23,8 MiB
    9× kleiner
    2,4 MiB pro Textur
  • ASTC 8×8
    2 Bit pro Texel
    13,3 MiB
    16× kleiner
    1,3 MiB pro Textur
  • ASTC 12×12
    0,89 Bit pro Texel
    6 MiB
    35,7× kleiner
    612 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.

AusprobierenEin Texel findenKlicke auf ein beliebiges Texel dieser 32×32-Textur. Ein Blockformat kann berechnen, wo es gespeichert ist – ein PNG nicht.

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

0511

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.

AusprobierenBC1-Block-ExplorerWähle einen 4×4-Block in der Beispieltextur und sieh genau, wie BC1 ihn speichert.
Block 12, 4

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.

Gängige GPU-Texturformate
FormatBit pro TexelAlphaTypische PlattformenGeeignet für
BC141 BitDesktop, KonsolenDeckende Farbe bei knappem Speicher
BC38JaDesktop, KonsolenFarbe mit weichem Alpha in älteren Inhalten
BC44DatenkanäleDesktop, KonsolenEin Kanal: Masken, Rauheit, Höhe
BC58DatenkanäleDesktop, KonsolenNormal Maps (X und Y)
BC6H8NeinDesktop, KonsolenHDR-Farbe wie Skyboxen und Lightmaps
BC78JaDesktop, KonsolenHochwertige Farbe, mit oder ohne Alpha
ETC14NeinFast alle Android-GeräteDeckende Farbe auf sehr alten Geräten
ETC24–8JaAndroid, iOSBreit unterstützte Mobil-Alternative
ASTC0.89–8JaAktuelle Android- und iOS-Geräte, Apple SiliconEinstellbare Qualität auf Mobilgeräten
PVRTC2–4JaÄltere iPhones und iPadsNur ältere Apple-Geräte
Basis ETC1SAbhängig vom ZielformatJaJede GPU, über KTX2Kleine Downloads, die auf jeder GPU laufen
Basis UASTCAbhängig vom ZielformatJaJede GPU, über KTX2Hohe Qualität, die auf jeder GPU läuft
AusprobierenDie echten Encoder ausführenKomprimiere das 512×512-Beispiel mit denselben WebAssembly-Encodern, die unsere Tools nutzen, und vergleiche einen vergrößerten Ausschnitt.
Läuft in deinem Browser. Nichts wird hochgeladen.
Vergrößerter Bereich
Original
RGBA8
1 MiB im GPU-Speicher
BC1
BC1
4 Bit pro Texel
128 KiB im GPU-Speicher
BC7
BC7
8 Bit pro Texel
256 KiB im GPU-Speicher
ASTC 6×6
ASTC 6×6
3,56 Bit pro Texel
116 KiB im GPU-Speicher
ASTC 12×12
ASTC 12×12
0,89 Bit pro Texel
29 KiB im GPU-Speicher

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.

AusprobierenFormatwählerWähle, wo die Textur läuft und was sie enthält.
Wo läuft sie?
Was steckt in der Textur?

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 öffnen

Kapitel 6

Praktische Tipps

Ein paar Gewohnheiten verhindern die meisten Probleme mit Texturkompression.

  1. 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.

  2. 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.

  3. 03

    Mipmaps erzeugen

    Sie kosten etwa 33 % mehr Speicher, verhindern aber Flimmern auf entfernten Flächen und beschleunigen das Abtasten.

  4. 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.

  5. 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.