Learn · concepts

Cos'è NanoVG? Grafica vettoriale per OpenGL

NanoVG è una piccola libreria grafica vettoriale 2D antialiasata per OpenGL. I client di Minecraft la utilizzano tramite LWJGL per disegnare HUD e interfacce nitide.

TRtrolPublished 3 min read

Cos'è NanoVG?

NanoVG è una piccola libreria grafica vettoriale antialiased per OpenGL, scritta in C. Disegna forme 2D, testo e sfumature con bordi lisci tramite un'API compatta. In un client di Minecraft, è accessibile tramite i binding LWJGL, in modo che il codice Java possa disegnare HUD e menu nitidi sopra il gioco. È deliberatamente piccola: l'intera libreria è un singolo file C con un'API focalizzata, il che è parte del motivo per cui compare in demo grafiche e livelli di interfaccia utente leggeri piuttosto che nel codice di un motore pesante.

Cosa fa NanoVG

NanoVG esegue il rendering di grafica vettoriale 2D sulla GPU tramite OpenGL. Si descrivono le forme con percorsi (linee, curve, rettangoli, cerchi), quindi si riempiono o si tracciano. La libreria gestisce l'antialiasing, quindi i bordi rimangono lisci a qualsiasi dimensione invece di diventare a blocchi come farebbe una bitmap allungata. Poiché il rendering è basato su percorsi, uno sviluppatore può creare pannelli arrotondati, sfumature e contorni da elementi primitivi anziché da immagini pre-cotte.

Il vantaggio principale è la scalabilità. Le immagini bitmap appaiono sfocate o pixelate quando vengono ingrandite. Le forme vettoriali rimangono nitide a qualsiasi risoluzione perché sono definite matematicamente, non pre-rasterizzate a una dimensione fissa. Questo mantiene l'aspetto coerente su diverse scale dell'interfaccia utente e dimensioni del display.

Perché i client di Minecraft lo utilizzano

Un client sovrappone la propria interfaccia a Minecraft: arraylist, menu, indicatori di forma, elementi HUD personalizzati. NanoVG offre a questa interfaccia un modo pulito per disegnare forme vettoriali e testo che si ridimensionano a qualsiasi risoluzione senza apparire frastagliati.

Poiché il rendering è basato su percorsi, uno sviluppatore può creare pannelli arrotondati, sfumature e contorni a partire da primitive anziché da immagini precompilate. Questo è più efficiente e più flessibile rispetto all'invio di cento versioni di dimensioni diverse della stessa texture di un pulsante.

NanoVG e LWJGL

Minecraft e i suoi mod funzionano sulla JVM, ma NanoVG è una libreria C. LWJGL colma il divario. Fornisce binding Java a librerie native come NanoVG e OpenGL, in modo che il codice Java possa chiamare direttamente le funzioni native. Un client si collega al modulo NanoVG di LWJGL, apre un contesto di disegno ed emette chiamate di percorso e pittura all'interno del ciclo di rendering del gioco. Il lato nativo esegue l'effettiva rasterizzazione sulla GPU.

NanoVG rispetto al disegno bitmap

AspettoNanoVG (vettoriale)Texture bitmap
BordiAntialiati a qualsiasi dimensioneSfocatura o aliasing quando scalati
FormeCostruite da percorsi a runtimeAsset immagine predefiniti
MemoriaLeggera, nessuna texture di grandi dimensioniCresce con il numero di immagini
Ideale perUI, forme, testo dinamicoFoto, arte fissa, icone

Le illustrazioni vettoriali sono ideali per gli elementi dell'interfaccia che cambiano dimensione o colore. Le bitmap rimangono la scelta migliore per opere d'arte dettagliate e fisse. La maggior parte delle interfacce reali utilizza entrambe.

DOMANDE FREQUENTI