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.
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
| Aspetto | NanoVG (vettoriale) | Texture bitmap |
|---|---|---|
| Bordi | Antialiati a qualsiasi dimensione | Sfocatura o aliasing quando scalati |
| Forme | Costruite da percorsi a runtime | Asset immagine predefiniti |
| Memoria | Leggera, nessuna texture di grandi dimensioni | Cresce con il numero di immagini |
| Ideale per | UI, forme, testo dinamico | Foto, 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
No. NanoVG è una libreria grafica C generica per OpenGL. Non è specifica per Minecraft. Un client la integra tramite LWJGL per disegnare la propria interfaccia.
I programmi C Java lo utilizzano tramite binding nativi come quelli forniti da LWJGL, piuttosto che chiamare direttamente il codice C.
No. Disegna sovrapposizioni 2D: HUD, menu, forme e testo. Il mondo di gioco vero e proprio è renderizzato dal motore di Minecraft.
Le immagini si sfocano o creano artefatti quando vengono scalate, e ognuna occupa memoria. NanoVG costruisce le forme partendo dalla matematica, quindi mantengono la nitidezza a qualsiasi scala dell'interfaccia grafica e occupano pochissima memoria.