Rust GPU 文档博客生态更新日志GitHub

最近的文章:

2025

2024

Shadertoys 移植到 Rust GPU

2025年4月10日 · 阅读时长约 4 分钟

Christian Legnitto Christian Legnitto Rust GPU 和 Rust CUDA 维护者

我们使用 Rust GPU 将一些流行的 Shadertoy 着色器移植到了 Rust。 这个过程很简单,我们想分享一些亮点。

代码可以在 GitHub 上找到。

Shadertoy 截图

什么是 Rust GPU?

Rust GPU 是一个允许你使用 Rust 编程语言为 GPU 编写代码的项目。 GPU 通常使用专门的语言进行编程,例如 WGSL, GLSL, MSL, 或 HLSL。 Rust GPU 改变了这一点,它允许你使用 Rust 编写 GPU 程序(通常称为 “着色器” 或 “内核”)。

这些 Rust GPU 程序随后被编译成 SPIR-V,这是一种 大多数 GPU 都能理解 的底层格式。 由于 SPIR-V 是 Vulkan 使用的格式,Rust GPU 使得将基于 Rust 的 GPU 程序集成到任何与 Vulkan 兼容的工作流程中成为可能。

有关更多详细信息,请查看 Rust GPU 网站GitHub 仓库

CPU 和 GPU 之间的共享代码

在着色器编程中,在 CPU 和 GPU 之间共享数据是很常见的。 这通常需要特殊的工具或手动操作。 在两端都使用 Rust 使这个过程变得无缝:

#[repr(C)]#[derive(Copy, Clone, Pod, Zeroable)]pubstructShaderConstants{pub width:u32,pub height:u32,pub time:f32,pub cursor_x:f32,pub cursor_y:f32,pub drag_start_x:f32,pub drag_start_y:f32,pub drag_end_x:f32,pub drag_end_y:f32,pub mouse_left_pressed:u32,pub mouse_left_clicked:u32,}

请注意,在 CPU 和 GPU 上,我们都使用了 bytemuck crate 来实现 PodZeroable derives。 这个 crate 未经修改,直接从 crates.io 集成。 许多 no_std + no alloc Rust crates 可以在 GPU 上工作!

Traits、泛型和宏

Rust GPU 支持 traits。 我们使用 traits 将特定于着色器的操作封装在可重用的符合人体工程学的抽象中:

pubtraitFloatExt{fngl_fract(self)->Self;fnrem_euclid(self, rhs:Self)->Self;fngl_sign(self)->Self;fndeg_to_radians(self)->Self;fnstep(self, x:Self)->Self;}

虽然仍然有一些粗糙的地方,但泛型在很大程度上可以按预期工作。 我们使用它们来支持多种通道类型,而无需重复逻辑:

pubstructState<C0,C1>{  inputs:Inputs<C0,C1>,  cam_point_at:Vec3,  cam_origin:Vec3,  time:f32,  ldir:Vec3,}

Rust 宏也可以正常工作。 使用宏可以让我们进一步减少重复代码。

macro_rules! deriv_impl {($ty:ty)=>{implDerivativefor$ty{deriv_fn!(ddx,OpDPdx,false);deriv_fn!(ddx_fine,OpDPdxFine,true);deriv_fn!(ddx_coarse,OpDPdxCoarse,true);deriv_fn!(ddy,OpDPdy,false);deriv_fn!(ddy_fine,OpDPdyFine,true);deriv_fn!(ddy_coarse,OpDPdyCoarse,true);deriv_fn!(fwidth,OpFwidth,false);deriv_fn!(fwidth_fine,OpFwidthFine,true);deriv_fn!(fwidth_coarse,OpFwidthCoarse,true);}};}// Applied easily to multiple types:deriv_impl!(f32);deriv_impl!(Vec2);deriv_impl!(Vec3A);deriv_impl!(Vec4);

标准 Rust 工具

想要类型检查着色器吗? cargo check。 构建它们? cargo build。 在发布模式下运行? cargo run --release。 在编译时门控代码? 使用 features

如果在着色器上运行 clippy,您会发现它会抱怨很多事情,因为我们有意地使着色器的 Rust 版本与它们的原始 GLSL 版本相似。

这是 Rust GPU 的一大优势:您可以使用所有您已经熟悉的 Rust 工具。

改进 Rust 生态系统

在移植着色器时,我们还通过识别和修复 wgpunaga 中的几个问题来回馈生态系统:

这些修复程序可以帮助所有使用 wgpunaga 的人,而不仅仅是 Rust GPU 的用户。

快来加入我们!

虽然我们遇到了一些尖锐的问题,但使用 Rust GPU 将 Shadertoy 着色器移植到 Rust 还是相当简单的。 Rust GPU 绝对已准备好进行着色器实验。

我们渴望增加更多的用户和贡献者! 我们将很快致力于改进入门和文档。 要跟进或参与其中,请查看 rust-gpu 在 GitHub 上的 repo

标签:

编辑此页面 较旧的文章 Rust CUDA 项目更新