- Um Qualitätsprobleme beim Text-Rendering, insbesondere die Grenzen SDF-(Distance-Field-)basierter Verfahren, zu lösen, wird eine neue Echtzeit-Vektor-Rendering-Technik vorgeschlagen
- Glyphen (Zeichen) werden in Form von Vektorkurven direkt an die GPU übertragen und dort in Echtzeit rasterisiert, wodurch unbegrenzte Auflösung und geringer Speicherverbrauch erreicht werden
- Mithilfe von Texture-Atlases und temporal accumulation werden hohe Antialiasing-Qualität und effizientes Caching realisiert
- Die Methode lässt sich auch auf verschiedene Subpixel-Strukturen (z. B. OLED, LCD usw.) anpassen und liefert glatte, scharfe Ergebnisse ohne Fringing (Farbsäume)
- Sie präsentiert einen einfachen, zugleich gut skalierbaren Ansatz für hochwertiges Font-Rendering in Echtzeit-Text, UI und Spielen
Einleitung: Die Herausforderungen des Text-Renderings
- Beim Echtzeit-Text-Rendering gibt es verschiedene Probleme wie Aliasing (Treppeneffekte), große Texturen, Build-Zeiten, Zooming/Scaling und flüssige Bewegung
- Das häufig verwendete Verfahren mit Multi-Channel Signed Distance Fields (SDFs) hatte Grenzen bei Qualität und Flexibilität
- Angestoßen durch die nicht standardisierten Subpixel-Strukturen moderner OLED-Monitore und das Problem des Fringing wurde ein neuer Ansatz entwickelt, der auch Subpixel-Antialiasing berücksichtigt
Grenzen des bisherigen SDF-Verfahrens
Qualität
- Beim SDF-Verfahren kommt es bei Schriftarten mit vielen feinen Details oder dünnen Strichen zu Qualitätsverlusten und Informationsverlust
- Wenn die Auflösung nicht erhöht wird, bleiben bei bestimmten Glyphen Artefakte zurück
Atlas-Größe
- SDFs werden zunächst offline erzeugt und dann als Atlas gespeichert; bei vielen Glyphen oder CJK-Schriftarten (Chinesisch, Japanisch, Koreanisch) wird das praktisch unrealistisch groß
- Werden mehrere Schriftarten gleichzeitig verwendet, steigen Speicherverbrauch und Streaming-Bandbreite stark an
Flexibilität und Einfachheit
- Durch die Zwischenstufe mit SDF wird der gesamte Ablauf vom Quelldatensatz bis zum Endergebnis komplex
- Die direkte Nutzung oder Bearbeitung von Echtzeit- oder dynamischen Vektorgrafiken ist stark eingeschränkt
Neuer Ansatz: Echtzeit-Rasterisierung von Vektorkurven
- Statt Texturen im Voraus zu erzeugen werden die Vektorkurvendaten der tatsächlich sichtbaren Glyphen (z. B. Bézier-Kurven) direkt an die GPU übertragen und dort sofort rasterisiert
- In einen Atlas-Texture werden nur so viele Glyphen eingefügt wie nötig; je nach Nutzungshäufigkeit werden sie beibehalten oder wieder freigegeben
- Solange eine Glyphe auf dem Bildschirm verbleibt, wird durch Akkumulation von Samples (temporal accumulation) ein sehr hochwertiges, noch glatteres antialiasiertes Ergebnis erzeugt
- Da die Verarbeitung stets vektorbasiert erfolgt, entstehen scharfe Ergebnisse ohne Auflösungsgrenze
Verarbeitung der Font-Kurvendaten
- Mit Open-Source-Bibliotheken wie FreeType werden verschiedene Font-Formate eingelesen und die Kurveninformationen der Glyphen extrahiert
- Glyphen werden als Linien sowie quadratische/kubische Bézier-Kurven geparst; alle Kurven werden in quadratische Bézier-Kurven umgewandelt, um die Verarbeitung im GPU-Shader zu vereinfachen
- Linien werden durch Hinzufügen eines mittleren Kontrollpunkts in quadratische Kurven umgewandelt
- Kubische Kurven werden in zwei geteilte quadratische Kurven umgewandelt
Berechnung der Coverage (Füllung innerhalb eines Pixels)
- Für jedes Pixel werden Schnittpunkte der Kurven mit einem horizontalen Strahl berechnet; über die Winding Number (akkumulierte Zahl der Schnittpunkte) wird entschieden, ob ein Punkt innen oder außen liegt
- Hunderte von Samples (n-fach akkumulierte Samples) werden aufsummiert; kleine Fehler haben auf das Endergebnis kaum Einfluss
- Mit einer Technik zur Platzierung von Sample-Punkten (quasirandom sequence) werden in jedem Frame Ergebnisse von unterschiedlichen Positionen aus akkumuliert
Optimierung des Kurvenzugriffs
- Glyphen werden in horizontale Bänder (bands) aufgeteilt; pro Band werden nur die relevanten Kurven getestet, um den Rechenaufwand zu reduzieren
- Durch Thread-Anordnung und bandweises Iterieren wird die Effizienz der GPU bei Bulk-Berechnungen maximiert
Atlas-Packing und -Verwaltung
- Jedes Glyphenbild wird einem Atlas (gemeinsam genutzte Textur) zugewiesen und dort verwaltet
- Fehlende Glyphen erhalten neu zugewiesenen Platz und werden rasterisiert; vorhandene Glyphen werden wiederverwendet
- Zur Einordnung: Selbst dieselbe Glyphe kann je nach Subpixel-Position und Größe in unterschiedlichen Versionen benötigt werden
- Mit Z-Order Packing (Morton-Code usw.) wird effizientes Packing zwischen einem eindimensionalen Bitset und 2D-Raum umgesetzt
- Je nach Sprachstruktur flexibel anpassbar, z. B. vertikal für lateinische Schriften, horizontal für arabische Schriften
- Wenn Glyphen nicht mehr benötigt werden, wird der Platz im Atlas erneut zugewiesen und weiterverwendet
Temporal Accumulation
- Durch Glyphen-Caching und Sample-Akkumulation werden direkt nach der Anzeige schnell hochwertige Samples gesichert und in späteren Frames weiter verfeinert
- Im ersten Frame 8 Samples/Pixel, danach schrittweise weniger Samples, bis zu maximal 512 akkumulierte Durchläufe
- So werden glatte Glyphendarstellung und Ressourcenoptimierung gleichzeitig erreicht
Subpixel-Antialiasing und Vermeidung von Fringing
- Das Rendering wird auf Subpixel-Ebene (RGB usw. als einzelne Samples) aufgeteilt, wodurch eine höhere horizontale Auflösung erreicht wird
- Unterstützung für Standard-LCD-Strukturen sowie verschiedene Anordnungen wie OLED/WOLED
- Glatter Effekt ohne Fringing (Farbsäume)
- Wenn Subpixel-Samples überlappend angeordnet werden, lässt sich sogar der tatsächliche Lichtmischungseffekt des Monitors berücksichtigen
- Auch ohne Pixelgrenzen oder Hinting sind natürliche und scharfe Ausgaben möglich
Warum der Ansatz pro Display-Subpixel-Struktur wichtig ist
- Wenn sich die Subpixel-Anordnung eines Monitors programmatisch ermitteln lässt, ist deutlich präziseres Rendering möglich
- Es wird betont, dass dies keine Hardware-Grenze, sondern ein Problem der Softwareverarbeitung ist
Fazit und Ausblick auf den Einsatz
- Gutes Text-Rendering hat großen Einfluss auf die gesamte Nutzbarkeit und Servicequalität
- Gerade in UI und Spielen kann eine hochwertige Schriftdarstellung einen erheblichen Unterschied im Produkterlebnis machen
- Die Arbeitsstruktur setzt die Prinzipien Einfachheit, Skalierbarkeit, hohe Qualität und Flexibilität um
- Mit Open-Source-Implementierung und Unterstützung für verschiedene Subpixel-Strukturen ist der Ansatz sehr gut für den realen industriellen bzw. produktiven Einsatz geeignet
1 Kommentare
Hacker-News-Kommentare