#矢量图形 #GPU #图形 #矢量 #画布 #绘图 #2D 图形

vger

动态 UI 的 2D GPU 渲染器

18 个版本

0.3.0 2024 年 7 月 10 日
0.2.8 2023 年 12 月 14 日
0.2.7 2023 年 5 月 31 日
0.2.5 2023 年 2 月 13 日
0.1.4 2022 年 3 月 27 日

#112 in 图形 API


用于 rui

MIT 许可证

100KB
2.5K SLoC

Rust 1.5K SLoC // 0.0% comments WebGPU Shader Language 524 SLoC // 0.1% comments

vger-rs

build status dependency status

vger 是一个矢量图形渲染器,它渲染一组有限的图元,但几乎完全在 GPU 上进行。将 VGER 端口移植到 Rust。用于 rui

状态

  • ✅ 二次贝塞尔曲线
  • ✅ 圆角矩形
  • ✅ 圆形
  • ✅ 线段(Audulus 需要正方形端点)
  • ✅ 弧线
  • ✅ 文本(Audulus 只使用一种字体,但如有需要,可以添加对更多字体的支持)
  • ✅ 多行文本
  • ✅ 路径填充
  • ✅ 剪裁
  • ❌ 图片

为什么?

我之前在 Audulus 中使用 nanovg,这消耗了太多的 CPU 资源用于即时模式 UI。nanovg 确实功能更全面,但对于 Audulus 来说,vger 在我的 120Hz iPad 上可以保持 120fps,而 nanovg 由于 CPU 端路径细分和其他开销而降至 30fps。vger 无需细分即可进行解析渲染,主要依靠片段着色器。

它是如何工作的

vger 为每个图元绘制一个或多个四边形,并在片段函数中使用 SDF 计算实际的图元形状。对于路径填充,vger 将路径分割成水平层板(参见 path.rs),以减少片段函数中的测试次数。

贝塞尔路径填充的情况有些原创。为了避免需要解二次方程(这存在数值问题),片段函数使用了一种类似反向Loop-Blinn的方法。为了确定一个点是在内部还是外部,vger测试了与每个贝塞尔曲线端点形成的线,对于每个与从该点发出的+x射线的交点,翻转内部/外部。然后vger测试了该点与贝塞尔段和线之间的区域,如果内部则再次翻转内部/外部。这避免了Loop-Blinn的预计算和Kokojima的AA问题。

参考文献

文本渲染恨你

文本渲染冒险

GPU上的矢量图形

120 FPS的GPU UI

依赖项

~5–37MB
~556K SLoC