vger 是一个矢量图形渲染器,它渲染一组有限的图元,但几乎完全在 GPU 上完成。 适用于 iOS 和 macOS。 API 是纯 C 语言。 用于渲染 Audulus。 Rust 端口位于 此处。
每个图元都可以填充纯色、渐变或纹理。 vger 将图元渲染为实例化的四边形,大部分计算都在片段着色器中完成。
这是一个 vger 渲染 Audulus UI 的截图
这是它渲染的 SVG 老虎(三次曲线通过一种糟糕的方法转换为二次曲线,并且我省略了笔画)
我之前使用 nanovg 来渲染 Audulus,但对于即时模式 UI 来说,它消耗了太多的 CPU。 nanovg 当然功能更全面,但对于 Audulus 而言,vger 可以在 120Hz iPad 上保持 120fps,而 nanovg 会因为 CPU 端的路径细分和其他开销而降至 30fps。 vger 通过分析方式渲染,无需细分,严重依赖于片段着色器。
如果您对非 Apple 平台感兴趣,请查看 rust 端口。
vger 为每个图元绘制一个四边形,并在片段函数中计算实际的图元形状。 对于路径填充,vger 将路径分割成水平板(参见 vgerPathScanner
),以减少片段函数中的测试次数。
贝塞尔路径填充的情况有些原创。 为了避免求解二次方程(这会有数值问题),片段函数使用一种反向 Loop-Blinn。 为了确定一个点是在内部还是外部,vger 针对每个贝塞尔曲线的端点之间形成的线进行测试,对于与来自该点的 +x 射线的每个交点,翻转内部/外部。 然后 vger 针对贝塞尔曲线段和该线之间的区域测试该点,如果在内部则再次翻转内部/外部。 这避免了 Loop-Blinn 的预计算,以及 Kokojima 的 AA 问题。
要将 vger 添加到您的 Xcode 项目,请选择 File -> Swift Packages -> Add Package Depedancy。 输入 https://github.com/audulus/vger 作为 URL。 勾选 use branch 选项并输入 main
。
有关完整的 API,请参见 vger.h
。 通过查看 这些测试,您可以很好地了解它的用法。
Vger 具有 C 接口,可以从 C、C++、ObjC 或 Swift 中使用。 vgerEncode
必须从 ObjC 或 Swift 中调用,因为它需要一个 MTLCommandBuffer
。
有关在 iOS/macOS SwiftUI 应用程序中使用 vger 的示例,请参见 演示应用程序。 vger 包含 VgerView
,使其在 SwiftUI 中使用 Vger 变得非常容易
import SwiftUI
import vger // C/C++/ObjC interface.
import vgerSwift // Swift nicities.
struct HelloView: View {
let cyan = SIMD4<Float>(0,1,1,1)
var body: some View {
VgerView(renderCallback: { vger in
vgerText(vger, "Hello world. This is V'Ger.", cyan, 0)
})
}
}