LinaVG 是一个 2D 矢量图形库,提供低级功能来绘制各种抗锯齿凸形状和线条,以及传统和有符号距离场(SDF)文本渲染。LinaVG 还提供丰富的样式选项,包括渐变、轮廓、阴影、可变线宽、填充和非填充形状、文本对齐/间距等多种功能!
LinaVG 本身不提供"渲染"功能。它根据您的绘制调用生成缓冲区,并以优化的缓冲区批次将它们发送回您指定的自定义后端。
话虽如此,示例项目提供了一个 OpenGL 后端示例,您基本上可以直接复制粘贴使用。此外,Lina Engine 使用 LinaVG 并有自定义 DirectX12 后端的示例。更多详情请查看 Wiki。
功能
LinaVG 的目的是为您提供一种简单的方法来进行低级抗锯齿形状、线条和文本渲染。它不提供任何窗口管理或输入功能,也不是一个 GUI 库。它假设您的应用程序已经设置了图形渲染后端和应用程序循环。
考虑到这一点,您可以使用 LinaVG 构建保留模式和即时模式的 GUI 应用程序/库。
LinaVG 最初是为 Lina Engine 制作的,但这个库完全独立于它。您可以在自己的项目中使用 LinaVG,只需最少的依赖项。
LinaVG 已在以下环境测试:
- MSVC 14.36.xxx
- Clang 17.0.1
线程安全
只要没有多个线程修改同一个 LinaVG::Drawer 对象,LinaVG 就是线程安全的。目前唯一不是线程安全的全局函数是那些用于加载字体的函数,这些函数需要用互斥锁包装。
特性
形状
- 矩形、三角形、多边形、圆形、半圆、弧形、用户定义凸形状
- 所有形状可以填充或不填充
- 纯色、垂直/水平/径向渐变
- 可自定义线宽
- 纹理、自定义 UV 偏移、自定义 UV 平铺
- 形状圆角,可选择只对特定角进行圆角处理
- 自定义旋转
轮廓
- 内轮廓、外轮廓或两者兼有
- 可自定义轮廓线宽
- 纯色、垂直/水平/径向渐变
- 纹理、自定义 UV 偏移、自定义 UV 平铺
抗锯齿
- 基于矢量的抗锯齿边框
- 帧缓冲缩放的抗锯齿线宽
- 用户自定义抗锯齿乘数
线条
- 单线条
- 多线条
- 贝塞尔曲线
- 线条端点:左、右和两端
- 可自定义线条端点圆角
- 线条连接:顶点平均、斜接、斜角、圆角斜角
- 所有轮廓选项也适用于线条
- 仅单线条支持自定义旋转
字体
- FreeType 字体加载
- SDF 字体
- 字体图集,图集合并
- 自定义字形范围
- Unicode 支持
文本
- 传统抗锯齿位图字形渲染
- 纯色,垂直/水平渐变
- 阴影,可自定义阴影颜色和偏移
- 字符间距
- 行间距
- 自动换行
- 文本对齐:左对齐、右对齐和居中
- 自定义旋转
SDF
- 所有文本选项适用于 SDF 文本
- SDF 厚度
- SDF 柔和度
- SDF 轮廓
实用工具
- 自定义绘制顺序,Z 轴排序
- 矩形裁剪
- 暴露的配置,如:垃圾回收间隔、缓冲区预留、抗锯齿参数、线条连接限制、纹理翻转、调试功能
安装
从 Releases 下载发布版本。
推荐使用 CMake 将 LinaVG 与您的应用程序一起链接。或者,您也可以自行构建 CMake 项目并链接生成的二进制文件,但请注意如果选择这种方式,您还需要链接生成的 FreeType 二进制文件。
使用 LINAVG_BUILD_EXAMPLES
选项构建示例项目。
cmake DLINAVG_BUILD_EXAMPLES=ON
使用 LINAVG_DISABLE_TEXT_SUPPORT
选项跳过文本支持和 FreeType 依赖。
cmake DLINAVG_DISABLE_TEXT_SUPPORT=ON
注意:LinaVG 需要 C++ 17 特性。
快速演示
以下是使用 LinaVG 进行绘图的最基本实现步骤。如主页所述,假设您的应用程序已经设置并运行了图形渲染后端,当然还包括一个具有有效上下文的窗口。
#include "LinaVG.hpp"
LinaVG::Drawer lvgDrawer;
lvgDrawer.GetCallbacks().drawDefault = std::bind(&MyRenderingBackend::DrawDefault, &myRenderer, std::placeholders::_1);
// 您的应用程序循环
while (m_applicationRunning)
{
// 设置样式,从红色到蓝色的渐变色
StyleOptions style;
style.isFilled = true;
style.color.start = Vec4(1, 0, 0, 1);
style.color.end = Vec4(0, 0, 1, 1);
// 从 (300, 300) 开始绘制一个 200x200 的矩形
const Vec2 min = Vec2(300, 300);
const Vec2 max = Vec2(500, 500);
lvgDrawer.DrawRect(min, max, style);
lvgDrawer.FlushBuffers();
lvgDrawer.ResetFrame();
}
就是这么简单!
LinaVG 在使用、配置、其他形状/线条/文本和样式方面还有很多内容。查看 Wiki 的其余部分或示例应用程序以了解所有内容。
许可证 (BSD 2-clause)
版权所有 [2022-] Inan Evin在遵守以下条件的情况下,允许以源代码和二进制形式重新分发和使用,无论是否经过修改:
-
源代码的再分发必须保留上述版权声明、本条件列表和以下免责声明。
-
以二进制形式再分发时,必须在随分发提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
本软件由版权所有者和贡献者"按原样"提供,不提供任何明示或暗示的保证,包括但不限于对适销性和特定用途适用性的暗示保证。在任何情况下,版权持有人或贡献者均不对任何直接、间接、偶然、特殊、示例性或后果性损害(包括但不限于替代商品或服务的采购;使用、数据或利润的损失;或业务中断)承担责任,无论是基于合同、严格责任还是侵权行为(包括疏忽或其他)的任何责任理论,即使事先被告知可能发生此类损害。
贡献
欢迎任何贡献和拉取请求。
支持
您可以加入 Lina Engine的Discord频道 讨论Lina项目。