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
100KB
2.5K SLoC
vger-rs
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问题。
参考文献
依赖项
~5–37MB
~556K SLoC