Learn · concepts
Czym jest NanoVG? Grafika wektorowa dla OpenGL
NanoVG to mała biblioteka grafiki wektorowej 2D z wygładzaniem krawędzi dla OpenGL. Klienci Minecrafta używają jej przez LWJGL do rysowania wyraźnych HUD-ów i interfejsów.
Czym jest NanoVG?
NanoVG to mała biblioteka grafiki wektorowej z wygładzaniem krawędzi dla OpenGL, napisana w C. Rysuje kształty 2D, tekst i gradienty z gładkimi krawędziami za pomocą jednego, zwartego API. W kliencie Minecraft dostępna jest poprzez bindingi LWJGL, dzięki czemu kod Java może rysować wyraźne HUD-y i menu na wierzchu gry. Została celowo zaprojektowana tak, aby była mała – cała biblioteka to pojedynczy plik C z dopracowanym API – co jest częścią powodu, dla którego pojawia się w demonstracjach graficznych i lekkich warstwach interfejsu użytkownika, a nie w ciężkim kodzie silnika.
Co robi NanoVG
NanoVG renderuje grafikę wektorową 2D na GPU za pomocą OpenGL. Opisujesz kształty za pomocą ścieżek (linii, krzywych, prostokątów, okręgów), a następnie wypełniasz je lub obrysowujesz. Biblioteka zajmuje się wygładzaniem krawędzi, dzięki czemu krawędzie pozostają gładkie w każdym rozmiarze, zamiast stawać się blokowe, jak w przypadku rozciągniętego bitmapy. Ponieważ renderowanie odbywa się na podstawie ścieżek, programista może tworzyć zaokrąglone panele, gradienty i obramowania z prymitywów zamiast wstępnie przygotowanych obrazów.
Kluczową zaletą jest skalowalność. Obrazy bitmapowe wyglądają rozmycie lub pikselowo, gdy są powiększane. Kształty wektorowe pozostają ostre w dowolnej rozdzielczości, ponieważ są zdefiniowane matematycznie, a nie wstępnie rastryzowane do stałego rozmiaru. Utrzymuje to spójny wygląd w różnych skalach interfejsu użytkownika i rozmiarach wyświetlacza.
Dlaczego klienci Minecraft używają go
Klient nakłada własny interfejs na Minecrafta: listy, menu, wskaźniki kształtów, niestandardowe elementy HUD-u. NanoVG zapewnia temu interfejsowi czysty sposób rysowania wektorowych kształtów i tekstu, który skaluje się do dowolnej rozdzielczości bez zacinania.
Ponieważ renderowanie jest oparte na ścieżkach, programista może tworzyć zaokrąglone panele, gradienty i obramowania z prymitywów zamiast gotowych obrazów. Jest to bardziej wydajne i elastyczne niż wysyłanie setki różnych wersji tego samego obrazu przycisku o różnych rozmiarach.
NanoVG i LWJGL
Minecraft i jego mody działają na JVM, ale NanoVG to biblioteka C. LWJGL wypełnia lukę. Zawiera powiązania Java dla bibliotek natywnych, takich jak NanoVG i OpenGL, dzięki czemu kod Java może bezpośrednio wywoływać funkcje natywne. Klient łączy się z modułem NanoVG LWJGL, otwiera kontekst rysowania i wydaje wywołania ścieżek i farb w pętli renderowania gry. Strona natywna wykonuje rzeczywiste rastryzowanie na GPU.
NanoVG w porównaniu z rysowaniem bitmapami
| Aspekt | NanoVG (wektorowy) | Tekstury bitmapowe |
|---|---|---|
| Krawędzie | Wygładzone przy dowolnym rozmiarze | Rozmycie lub zacinanie podczas skalowania |
| Kształty | Tworzone ze ścieżek w czasie działania | Gotowe zasoby graficzne |
| Pamięć | Lekkie, brak dużych tekstur | Rośnie wraz z liczbą obrazów |
| Najlepsze do | Interfejsów użytkownika, kształtów, dynamicznego tekstu | Zdjęć, stałej grafiki, ikon |
Wektorowe rysunki są lepsze dla elementów interfejsu, które zmieniają rozmiar lub kolor. Mapy bitowe wciąż wygrywają, jeśli chodzi o szczegółowe, nieruchome grafiki. Większość prawdziwych interfejsów wykorzystuje oba te formaty.
FAQ
Nie. NanoVG to ogólna biblioteka grafiki C dla OpenGL. Nie jest specyficzna dla Minecrafta. Klient osadza ją za pomocą LWJGL, aby rysować własny interfejs.
Programy C Java używają go za pomocą natywnych wiązań, takich jak te, które udostępnia LWJGL, zamiast bezpośrednio wywoływać kod C.
Nie. Rysuje nakładki 2D: HUD-y, menu, kształty i tekst. Sam świat gry jest renderowany przez własny silnik Minecrafta.
Obrazy zacierają się lub pojawiają artefakty podczas skalowania, a każdy z nich zajmuje pamięć. NanoVG tworzy kształty na podstawie matematyki, dzięki czemu pozostają ostre przy dowolnej skali interfejsu graficznego i zajmują bardzo mało miejsca.