Learn · concepts

Qu'est-ce que NanoVG ? Graphiques vectoriels pour OpenGL

NanoVG est une petite bibliothèque de graphiques vectoriels 2D antialiés pour OpenGL. Les clients Minecraft l'utilisent via LWJGL pour dessiner des HUD et des interfaces nets.

TRtrolPublished 4 min read

Qu'est-ce que NanoVG ?

NanoVG est une petite bibliothèque de graphiques vectoriels antialiés pour OpenGL, écrite en C. Elle dessine des formes 2D, du texte et des dégradés aux bords lisses à partir d'une API compacte. Dans un client Minecraft, elle est accessible via des liaisons LWJGL, permettant au code Java de peindre des HUD et des menus nets par-dessus le jeu. Elle est délibérément petite — toute la bibliothèque est un seul fichier C avec une API ciblée — ce qui explique en partie pourquoi elle apparaît dans les démonstrations graphiques et les couches d'interface utilisateur légères plutôt que dans le code de moteur lourd.

Ce que fait NanoVG

NanoVG rend les graphiques vectoriels 2D sur le GPU via OpenGL. Vous décrivez les formes avec des chemins (lignes, courbes, rectangles, cercles), puis vous les remplissez ou les tracez. La bibliothèque gère l'antialiasing, de sorte que les bords restent lisses à n'importe quelle taille au lieu de devenir pixelisés comme le serait une bitmap étirée. Étant donné que le rendu est basé sur des chemins, un développeur peut créer des panneaux arrondis, des dégradés et des contours à partir de primitives plutôt que d'images pré-cuites.

L'avantage principal est l'évolutivité. Les images bitmap apparaissent floues ou pixelisées lorsqu'elles sont agrandies. Les formes vectorielles restent nettes à n'importe quelle résolution car elles sont définies mathématiquement, et non pré-rasterisées à une taille fixe. Cela maintient une apparence cohérente à travers les échelles d'interface utilisateur et les tailles d'affichage.

Pourquoi les clients Minecraft l'utilisent

Un client superpose sa propre interface à Minecraft : listes de tableaux, menus, indicateurs de forme, éléments d’interface utilisateur (HUD) personnalisés. NanoVG offre à cette interface un moyen propre de dessiner des formes vectorielles et du texte qui se mettent à l’échelle pour s’adapter à n’importe quelle résolution sans apparaître pixélisés.

Étant donné que le rendu est basé sur des chemins, un développeur peut créer des panneaux arrondis, des dégradés et des contours à partir de primitives plutôt que d’images pré-cuites. C’est plus efficace et plus flexible que d’envoyer une centaine de versions de tailles différentes de la même texture de bouton.

NanoVG et LWJGL

Minecraft et ses mods fonctionnent sur la JVM, mais NanoVG est une bibliothèque C. LWJGL comble le fossé. Il fournit des liaisons Java vers des bibliothèques natives telles que NanoVG et OpenGL, permettant au code Java d’appeler directement les fonctions natives. Un client se lie au module NanoVG de LWJGL, ouvre un contexte de dessin et effectue des appels de chemin et de peinture dans la boucle de rendu du jeu. Le côté natif effectue l’antisérialisation réelle sur le GPU.

NanoVG par rapport au dessin bitmap

AspectNanoVG (vectoriel)Textures bitmap
BordsAntisérialisés à n’importe quelle tailleFlou ou pixélisation à l’échelle
FormesConstruit à partir de chemins au moment de l’exécutionRessources d’images pré-faites
MémoireLéger, pas de grandes texturesAugmente avec le nombre d’images
Idéal pourInterfaces utilisateur, formes, texte dynamiquePhotos, œuvres d’art fixes, icônes

Les graphiques vectoriels sont à privilégier pour les éléments d'interface qui changent de taille ou de couleur. Les bitmaps restent gagnantes pour les illustrations détaillées et fixes. La plupart des interfaces réelles utilisent les deux.

FAQ