- NanoVG — небольшая библиотека 2D-векторной графики с антиалиасингом для OpenGL, написанная на C.
- Она отрисовывает фигуры, текст и градиенты из путей, обеспечивая плавные края любого размера.
- Minecraft-клиенты обращаются к ней через привязки LWJGL для отрисовки HUD и меню.
- Векторная графика выигрывает в случае масштабируемого пользовательского интерфейса, а бинарные изображения — для фиксированной графики.
NanoVG — это небольшая библиотека векторгафики с антиалиасингом для OpenGL, написанная на C. Она рисует 2D-фигуры, текст и градиенты с гладкими краями с помощью одного компактного API. В клиенте Minecraft она доступна через привязки LWJGL, чтобы Java-код мог отрисовывать четкие HUD-элементы и меню поверх игры.
Где используется Opal
Opal — это мод для Fabric, который накладывает собственный интерфейс поверх игры. Если вы хотите добавить собственные функции, руководство по скриптам показывает, как это сделать на JavaScript.
Что делает NanoVG
NanoVG отрисовывает 2D векторную графику на GPU через OpenGL. Вы описываете фигуры с помощью путей (линии, кривые, прямоугольники, круги), а затем заполняете или обводите их. Библиотека обрабатывает сглаживание, поэтому края остаются гладкими в любом размере, а не становятся блочными, как растянутый растровый образ.
Она намеренно небольшая. Вся библиотека — это один C-файл с узким API, что и является одной из причин, по которой она встречается в графических демонстрациях и легковесных слоях пользовательского интерфейса, а не в коде тяжелых движков.
Почему клиент Minecraft использует её
Клиент отрисовывает собственный интерфейс поверх Minecraft: массивы списков, меню, индикаторы формы, пользовательские элементы HUD. NanoVG предоставляет этому интерфейсу чистый способ рисовать векторные фигуры и текст, которые масштабируются до любого разрешения без зазубрин.
Благодаря тому, что отрисовка основана на путях, разработчик может создавать скругленные панели, градиенты и обводки из примитивов вместо предварительно запеченных изображений. Это сохраняет согласованность внешнего вида при разных масштабах GUI и размерах дисплея.
NanoVG и LWJGL
Minecraft и его моды работают на JVM, но NanoVG — это C-библиотека. LWJGL устраняет этот разрыв. Он поставляется с Java-биндингами к нативным библиотекам, таким как NanoVG и OpenGL, чтобы Java-код мог напрямую вызывать нативные функции.
Клиент компонует ссылку на модуль LWJGL NanoVG, открывает контекст рисования и выполняет вызовы функций для отрисовки путей и заливки внутри игрового цикла рендеринга. Нативная сторона выполняет фактическую растеризацию на GPU.
NanoVG против рисования на основе растровых изображений
| Аспект | NanoVG (вектор) | Растровые текстуры |
|---|---|---|
| Края | Сглажены на любом размере | Размытие или алиасинг при масштабировании |
| Фигуры | Создаются из путей во время выполнения | Готовые изображения |
| Память | Небольшой объем, без больших текстур | Увеличивается с количеством изображений |
| Лучше всего подходит для | Интерфейса, фигур, динамического текста | Фотографий, фиксированной графики, иконок |
Векторная графика выигрывает для элементов интерфейса, которые меняют размер или цвет. Растровые изображения по-прежнему выигрывают для детализированной, фиксированной графики.
FAQ
Нет. NanoVG — это общая графическая библиотека на C для OpenGL. Она не специфична для Minecraft. Клиент внедряет её через LWJGL для отрисовки собственного интерфейса.
Программы на Java используют его через нативные привязки, такие как те, которые предоставляет LWJGL, а не вызывают C-код напрямую.
Нет. Оно рисует 2D-наложения: HUD, меню, фигуры и текст. Сам игровой мир отрисовывается собственным движком Minecraft.
Изображения размываются или алиасируются при масштабировании, и каждое из них требует памяти. NanoVG строит фигуры из математических вычислений, поэтому они остаются четкими при любом масштабе графического интерфейса и занимают мало места.