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 来实现 Pod 和 Zeroable 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 生态系统​

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

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

快来加入我们!​

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

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

标签:

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