- Une nouvelle technique de rendu vectoriel en temps réel est proposée pour résoudre les problèmes de qualité du rendu de texte, en particulier les limites des approches basées sur les SDF (champs de distance)
- En envoyant directement au GPU les glyphes sous forme de courbes vectorielles afin de les rastériser en temps réel, elle permet d’obtenir une résolution illimitée tout en réduisant l’usage mémoire
- L’utilisation d’un atlas de textures et de l’accumulation temporelle permet d’atteindre une qualité d’anticrénelage élevée ainsi qu’un cache efficace
- La méthode peut être adaptée à diverses structures de sous-pixels (par exemple OLED, LCD, etc.), pour produire un résultat lisse et net sans problème de franges colorées
- Elle propose une approche simple mais très extensible pour le rendu de polices haute qualité dans le texte en temps réel, les interfaces UI, les jeux, etc.
Introduction : les défis du rendu de texte
- Le rendu de texte en temps réel pose de nombreux problèmes : aliasing (effet d’escalier), textures volumineuses, temps de build, zoom, défilement fluide, etc.
- L’approche Multi-Channel Signed Distance Fields (SDF), très utilisée jusqu’ici, présentait des limites en matière de qualité et de flexibilité
- Les structures de sous-pixels non standard des moniteurs OLED récents, ainsi que les problèmes de franges colorées, ont conduit au développement d’une nouvelle approche intégrant aussi l’anticrénelage sous-pixel
Limites des approches SDF existantes
Qualité
- Avec les SDF, les polices comportant beaucoup de détails fins ou de traits minces subissent une baisse de qualité et des pertes d’information
- Sans augmentation de la résolution, certains glyphes conservent des artefacts
Taille de l’atlas
- Les SDF sont générés hors ligne puis stockés dans un atlas, mais avec un grand nombre de glyphes ou des polices CJK (chinois, japonais, coréen), la taille devient pratiquement ingérable
- L’utilisation simultanée de plusieurs polices augmente fortement la consommation mémoire et la pression sur la bande passante de streaming
Flexibilité et simplicité
- Le passage par l’étape intermédiaire des SDF complexifie l’ensemble du flux, depuis les données source jusqu’au résultat final
- Cela limite fortement l’utilisation ou l’édition directe en temps réel d’images vectorielles dynamiques
Nouvelle approche : rastérisation en temps réel de courbes vectorielles
- Au lieu de pré-générer des textures, les données de courbes vectorielles des glyphes réellement visibles à l’écran (courbes de Bézier, etc.) sont envoyées directement au GPU puis rastérisées sur place
- Seuls les glyphes nécessaires sont placés dans l’atlas de textures, puis conservés ou libérés selon leur fréquence d’usage
- Tant qu’un glyphe reste affiché, l’accumulation d’échantillons dans le temps (temporal accumulation) permet d’obtenir un résultat anticrénelé très haute qualité et plus doux
- Comme le traitement reste toujours basé sur le vectoriel, le rendu demeure net sans limitation de résolution
Traitement des données de courbes des polices
- Des bibliothèques open source comme FreeType permettent de lire divers formats de police et d’extraire les informations de courbes des glyphes
- Les glyphes sont analysés sous forme de lignes et de courbes de Bézier quadratiques/cubiques, puis toutes les courbes sont converties en courbes de Bézier quadratiques afin de simplifier le traitement dans les shaders GPU
- Les lignes sont converties en courbes quadratiques par ajout d’un point de contrôle intermédiaire
- Les courbes cubiques sont transformées en deux courbes quadratiques subdivisées
Calcul de la couverture (remplissage à l’intérieur du pixel)
- Pour chaque pixel, on calcule les intersections entre les courbes et un rayon horizontal, puis on détermine l’intérieur/l’extérieur via le winding number (nombre cumulé d’intersections)
- Des centaines d’échantillons (n accumulations d’échantillons) sont additionnés, et certaines petites erreurs n’ont pratiquement aucun effet sur le résultat final
- Une technique de placement de points d’échantillonnage (séquence quasi aléatoire) permet d’accumuler les résultats à des positions variées à chaque frame
Optimisation de l’accès aux courbes
- Les glyphes sont découpés en bandes horizontales, et seules les courbes pertinentes pour chaque bande sont testées, afin de réduire la quantité de calcul
- La répartition des threads et l’itération par bande maximisent l’efficacité des traitements massifs sur GPU
Empaquetage et gestion de l’atlas
- Chaque image de glyphe est allouée puis gérée dans l’atlas (texture partagée)
- Si le glyphe est absent, un nouvel espace est alloué puis rastérisé ; s’il est déjà présent, il est réutilisé
- À noter que même pour un même glyphe, des versions différentes peuvent être nécessaires selon la position sous-pixel et la taille
- Un Z-Order Packing (code Morton, etc.) permet un empaquetage efficace entre un bitmap 1D et un espace 2D
- L’approche peut être adaptée avec souplesse selon la structure des langues, par exemple orientation verticale pour les langues latines, horizontale pour l’arabe, etc.
- Lorsqu’un glyphe n’est plus nécessaire, l’espace qu’il occupait dans l’atlas peut être réalloué
Accumulation temporelle
- Grâce au cache de glyphes et à l’accumulation d’échantillons, il est possible d’obtenir rapidement des échantillons de haute qualité juste après l’affichage, puis d’affiner progressivement le rendu dans les frames suivantes
- La première frame utilise 8 échantillons/pixel, puis le nombre diminue progressivement, avec un maximum de 512 accumulations
- La méthode concilie affichage fluide des glyphes et optimisation des ressources
Anticrénelage sous-pixel et prévention des franges colorées
- Le rendu alloue la zone de calcul au niveau des sous-pixels (en considérant chaque composant comme RGB comme un échantillon), ce qui augmente la résolution horizontale effective
- Prise en charge de différentes dispositions, notamment la structure standard des LCD ainsi que les arrangements OLED/WOLED
- Permet d’obtenir un effet lisse sans franges colorées
- En disposant les échantillons de sous-pixels avec chevauchement (overlapping), il est aussi possible de refléter l’effet réel de mélange lumineux du moniteur
- Un rendu naturel et net est possible même sans frontières de pixels ni hinting
Importance d’une approche adaptée à la structure de sous-pixels de chaque écran
- Si les informations sur l’agencement des sous-pixels du moniteur peuvent être récupérées par logiciel, un rendu bien plus précis devient possible
- L’article souligne qu’il s’agit moins d’une limite matérielle que d’un problème de traitement logiciel
Conclusion et perspectives d’usage
- Un bon rendu de texte a un impact important sur l’utilisabilité globale et la qualité d’un service
- En particulier dans les UI et les jeux, une représentation typographique de haute qualité peut faire une vraie différence dans l’expérience produit
- Cette architecture concrétise les principes de simplicité, extensibilité, haute qualité et flexibilité
- Avec une implémentation open source et la prise en charge de diverses structures de sous-pixels, elle est très adaptée à une utilisation industrielle et en production
1 commentaires
Commentaires Hacker News