将 Shadertoys 移植到 Rust GPU
Rust GPU DocsBlogEcosystemChangelogGitHub 近期文章
2025
2024
Shadertoys 移植到 Rust GPU
2025年4月10日 · 阅读时长 4 分钟
Christian Legnitto
Rust GPU 和 Rust CUDA 维护者
我们使用 Rust GPU 将一些流行的 Shadertoy 着色器移植到了 Rust。移植过程相当直接,我们想分享一些重点。
代码可以在 GitHub 上找到。
什么是 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
的 derive。这个 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 绝对可以进行着色器实验了。
我们渴望增加更多的用户和贡献者! 我们将很快致力于改进入门和文档。 要关注或参与其中,请查看 GitHub 上的 rust-gpu
仓库。
标签: