#wgsl #shader #experimental #import #compile-time #error #convert

wgsl_ln

用于在Rust中编写wgsl的实验性crate!

3个不稳定版本

0.2.1 2024年7月13日
0.2.0 2024年7月11日
0.1.0 2024年7月10日

#582 in 过程宏

MIT/Apache

23KB
319

wgsl_ln

Crates.io Docs

用于在Rust中编写wgsl的实验性crate!

wgsl!

wgsl!宏将普通Rust标记转换为wgsl &'static str,类似于stringify!。这也使用naga验证wgsl字符串。错误将报告正确的范围。

pub static MANHATTAN_DISTANCE: &str = wgsl!(
    fn manhattan_distance(a: vec2<f32>, b: vec2<f32>) -> f32 {
        return abs(a.x - b.x) + abs(a.y - b.y);
    }
);

大多数错误可以在编译时捕获。

pub static MANHATTAN_DISTANCE: &str = wgsl!(
    fn manhattan_distance(a: vec2<f32>, b: vec2<f32>) -> f32 {
        // not allowed in wgsl
        abs(a.x - b.x) + abs(a.y - b.y)
    }
);

#[wgsl_export(name)]

通过wgsl_export导出wgsl项目(函数、结构体等)。必须与导出项目的name相同。

#[wgsl_export(manhattan_distance)]
pub static MANHATTAN_DISTANCE: &str = wgsl!(
    fn manhattan_distance(a: vec2<f32>, b: vec2<f32>) -> f32 {
        return abs(a.x - b.x) + abs(a.y - b.y);
    }
);

使用导出项目

pub static MANHATTAN_DISTANCE_TIMES_FIVE: &str = wgsl!(
    fn manhattan_distance_times_five(a: vec2<f32>, b: vec2<f32>) -> f32 {
        return #manhattan_distance(a, b) * 5.0;
    }
);

#manhattan_distancemanhattan_distance函数复制到模块中,使其可用。您可以为多个实例指定#manhattan_distance或省略后续使用中的#

实际上发生了什么?

wgsl_export创建一个将自身粘贴到wgsl!宏中的macro_rules!宏。该宏是#[doc(hidden)]并在crate根目录中可用,即crate::__wgsl_paste_manhattan_distance!

使用您crate中定义的项目时,无需导入任何内容;对于其他crate,您可能希望导入crate根目录。

mod my_shaders {
    pub use external_shader_defs::*;

    pub static MAGIC: &str = wgsl!(
        fn magic() -> f32 {
            return #magic_number();
        }
    )
}
pub use my_shaders::MAGIC;

naga_oil 支持

启用 naga_oil 功能以启用有限的 naga_oil 支持

  • #preprocessor_macro_name 作为标记而不是导入处理。
    • #define_import_path
    • #import
    • #if
    • #ifdef
    • #ifndef
    • #else
    • #endif

这些值不再可导入。

  • 检测到 naga_oil 预处理器宏时将禁用检查。

许可证

在以下许可证中选择一个:

Apache License, Version 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0) MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT),任选其一。

贡献

欢迎贡献!

除非您明确表示,否则您提交给工作内容的任何贡献,如 Apache-2.0 许可证中定义,应按上述方式双许可,没有任何附加条款或条件。

依赖项

~5–13MB
~153K SLoC