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.

TRtrolPublished 3 min read

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

AspektNanoVG (wektorowy)Tekstury bitmapowe
KrawędzieWygładzone przy dowolnym rozmiarzeRozmycie lub zacinanie podczas skalowania
KształtyTworzone ze ścieżek w czasie działaniaGotowe zasoby graficzne
PamięćLekkie, brak dużych teksturRośnie wraz z liczbą obrazów
Najlepsze doInterfejsów użytkownika, kształtów, dynamicznego tekstuZdjęć, 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