3 个不稳定版本

0.2.1 2024 年 7 月 16 日
0.2.0 2024 年 6 月 8 日
0.1.0 2024 年 3 月 4 日

#18渲染

Download history 1289/week @ 2024-05-04 619/week @ 2024-05-11 827/week @ 2024-05-18 580/week @ 2024-05-25 631/week @ 2024-06-01 710/week @ 2024-06-08 1044/week @ 2024-06-15 973/week @ 2024-06-22 2434/week @ 2024-06-29 909/week @ 2024-07-06 1135/week @ 2024-07-13 1667/week @ 2024-07-20 1542/week @ 2024-07-27 2534/week @ 2024-08-03 1366/week @ 2024-08-10 473/week @ 2024-08-17

6,226 每月下载量
用于 6 crates

Apache-2.0 OR MIT

620KB
13K SLoC

Rust 10K SLoC // 0.1% comments WebGPU Shader Language 4K SLoC // 0.1% comments

Vello

一个实验性的以 GPU 计算为中心的 2D 渲染器

Latest published version. Documentation build status. Apache 2.0 or MIT license. Required wgpu version.
Linebender Zulip chat. GitHub Actions CI status. Dependency staleness status.

Vello 是一个用 Rust 编写的实验性 2D 图形渲染引擎,侧重于 GPU 计算。它可以使用 wgpu 进行 GPU 访问,以交互式或近交互式性能绘制大型 2D 场景。

快速入门运行示例程序

cargo run -p with_winit

image

它被用作 Xilem(一个 Rust GUI 工具包)的渲染后端。

⚠️ 警告

Vello 目前可以被认为是处于 alpha 状态。特别是,我们还在以下方面进行工作

重大更改已在 变更日志 中记录。

动机

Vello 的目的是填补与 Skia、Cairo 和其前身项目 Piet 相同的图形堆栈中的位置。在基本层面上,这意味着它提供了使用受 PostScript 启发的 API 渲染形状、图像、渐变、文本等工具,与 SVG 文件和浏览器 <canvas> 元素 的 API 相同。

Vellose的卖点在于它通过更好地利用GPU,比其他渲染器获得了更好的性能。在传统的PostScript样式渲染器中,渲染过程中的某些步骤,如排序和裁剪,要么需要在CPU中处理,要么通过使用中间纹理来完成。Vello通过使用前缀和算法来并行化通常需要按顺序发生的工作,从而将工作卸载到GPU上,同时最大限度地减少对临时缓冲区的使用,避免了这一点。

这意味着Vello需要支持计算着色的GPU才能运行。

入门指南

Vello旨在深入集成到UI渲染堆栈中。虽然在一个Vello场景中绘制很简单,但将该场景渲染到表面需要设置一个wgpu上下文,这是一个复杂的任务。

要使用Vello作为您的PDF阅读器/ GUI工具包等的渲染器,您的代码将大致如下所示

// Initialize wgpu and get handles
let (width, height) = ...;
let device: wgpu::Device = ...;
let queue: wgpu::Queue = ...;
let surface: wgpu::Surface<'_> = ...;
let texture_format: wgpu::TextureFormat = ...;
let mut renderer = Renderer::new(
   &device,
   RendererOptions {
      surface_format: Some(texture_format),
      use_cpu: false,
      antialiasing_support: vello::AaSupport::all(),
      num_init_threads: NonZeroUsize::new(1),
   },
).expect("Failed to create renderer");

// Create scene and draw stuff in it
let mut scene = vello::Scene::new();
scene.fill(
   vello::peniko::Fill::NonZero,
   vello::Affine::IDENTITY,
   vello::Color::rgb8(242, 140, 168),
   None,
   &vello::Circle::new((420.0, 200.0), 120.0),
);

// Draw more stuff
scene.push_layer(...);
scene.fill(...);
scene.stroke(...);
scene.pop_layer(...);

// Render to your window/buffer/etc.
let surface_texture = surface.get_current_texture()
   .expect("failed to get surface texture");
renderer
   .render_to_surface(
      &device,
      &queue,
      &scene,
      &surface_texture,
      &vello::RenderParams {
         base_color: Color::BLACK, // Background color
         width,
         height,
         antialiasing_method: AaConfig::Msaa16,
      },
   )
   .expect("Failed to render to surface");
surface_texture.present();

请参阅存储库中的 examples 目录,以获取与winit等框架集成的代码。

性能

我们观察到,在M1 Max上对paris-30k测试场景的测试中,我们获得了177 fps的性能,分辨率为1600像素平方,这是出色的性能,代表了引擎的一个最佳案例。

更多正式的基准测试即将到来。

集成

SVG

通过vello_svg,可以获得一个用于渲染SVG文件的独立Linebender集成。

Lottie

通过velato,可以获得一个用于播放Lottie动画的独立Linebender集成。

Bevy

通过bevy_vello,可以获得一个用于在Bevy中渲染原始场景或Lottie和SVG文件的独立Linebender集成。

示例

我们的示例存储在存储库的examples目录中的独立包中。这使得它们可以拥有独立的依赖关系和更快的构建速度。示例必须使用--package(或-p)Cargo标志来选择。

Winit

我们的winit示例(examples/with_winit)演示了将渲染到winit窗口。默认情况下,它渲染了GhostScript Tiger以及您在examples/assets/downloads目录中添加的所有SVG文件。也可以提供自定义的SVG文件路径列表(以及渲染所有SVG文件所在的目录)作为参数。它还包括一组测试场景,展示了vello的功能,可以使用--test-scenes来展示。

cargo run -p with_winit

平台

我们旨在针对所有可以支持WebGPU的默认限制的环境。我们依赖wgpu来提供此支持。其他平台更为复杂,可能需要特殊的构建/运行程序。

Web

由于Vello严重依赖于计算着色器,因此我们依赖正在兴起的WebGPU标准在网络上运行。浏览器对WebGPU的支持仍在不断发展。Vello已使用Chrome的生产版本进行测试,但Firefox和Safari中的WebGPU支持仍然是实验性的。可能需要使用开发浏览器并显式启用WebGPU。

以下命令构建并运行winit演示的Web版本。这使用cargo-run-wasm构建示例以用于Web,并为主机提供本地服务器

# Make sure the Rust toolchain supports the wasm32 target
rustup target add wasm32-unknown-unknown

# The binary name must also be explicitly provided as it differs from the package name
cargo run_wasm -p with_winit --bin with_winit_bin

还有一个可在此处使用的Web演示。

⚠️ 警告

目前Vello并不是主要的Web目标,并且WebGPU的实现还不完整,因此您在运行此示例时可能会遇到问题。

Android

with_winit 示例支持在Android上运行,使用 cargo apk

cargo apk run -p with_winit

💡 小贴士

cargo apk不支持在不进行配置的情况下以发布模式运行。请参阅他们的crates页面文档(大约在package.metadata.android.signing.<profile>部分)。

另请参阅 cargo-apk#16。要发布模式运行,您必须将以下内容添加到examples/with_winit/Cargo.toml(将$HOME替换为您的家目录)

[package.metadata.android.signing.release]
path = "$HOME/.android/debug.keystore"
keystore_password = "android"

📝 注意

由于cargo apk不允许在运行时将命令行参数或环境变量传递给应用程序,因此可以在编译时将这些嵌入到程序中(目前仅限Android)with_winit目前支持以下环境变量

  • VELLO_STATIC_LOG,相当于 RUST_LOG
  • VELLO_STATIC_ARGS,相当于传递命令行参数

例如(使用Unix shell环境变量语法)

VELLO_STATIC_LOG="vello=trace" VELLO_STATIC_ARGS="--test-scenes" cargo apk run -p with_winit --lib

最小支持的Rust版本(MSRV)

本版本的Vello已被验证可以与 Rust 1.75 及以后版本编译。

Vello的未来版本可能会提高Rust版本要求。这不会被视为破坏性更改,甚至可能在小的补丁版本中发生。

如果编译失败,请点击此处。

随着时间的推移,Vello的一些依赖项可能发布了具有更高Rust要求的版本。如果您遇到由于依赖项导致的编译问题,且不想升级您的Rust工具链,则可以降级依赖项。

# Use the problematic dependency's name and version
cargo update -p package_name --precise 0.1.1

社区

Vello的开发讨论发生在Linebender Zulip中,特别是#gpu 流。所有公共内容都可以在不登录的情况下阅读。

欢迎通过拉取请求贡献。适用Rust行为准则

历史

Vello以前被称为piet-gpu。这个之前的版本使用了一个自定义的跨API硬件抽象层,称为piet-gpu-hal,而不是wgpu

此版本的存档可以在分支 custom-hal-archive-with-shaderscustom-hal-archive 中找到。这个版本继承了之前的原型 piet-metal,并包括了来自 piet-dx12 的修改。

关于放弃使用piet-gpu-hal而选择WebGPU的决策在博客文章Requiem for piet-gpu-hal中有详细讨论。

2020年12月的一份愿景文档解释了项目的长期目标以及我们如何实现这些目标。其中许多项目已过时或完成,但仍可能提供一些有用的背景信息。

Velloy从许多其他渲染项目中汲取灵感,包括

许可证

根据以下之一获得许可

由您选择。

依赖关系

~12-43MB
~691K SLoC