#glsl #std140 #std430 #macro-derive #io-write

无std crevice_notan

创建具有显式初始化填充的与GLSL兼容的结构体版本

2个不稳定版本

0.13.0 2023年4月24日
0.11.0 2022年7月10日

#522 in Rust模式

Download history 134/week @ 2024-03-11 153/week @ 2024-03-18 278/week @ 2024-03-25 265/week @ 2024-04-01 135/week @ 2024-04-08 195/week @ 2024-04-15 140/week @ 2024-04-22 179/week @ 2024-04-29 255/week @ 2024-05-06 242/week @ 2024-05-13 202/week @ 2024-05-20 184/week @ 2024-05-27 184/week @ 2024-06-03 180/week @ 2024-06-10 174/week @ 2024-06-17 182/week @ 2024-06-24

每月740次下载
15个crate中使用(通过notan_graphics

MIT/Apache

60KB
1K SLoC

Crevice

Crevice的分支,用于在notan内部使用,因为派生宏不能重新导出。

GitHub CI Status crevice on crates.io crevice docs

Crevice通过派生宏的强大功能创建与GLSL兼容的类型版本。生成的结构体提供as_bytes方法,允许安全地将数据打包到缓冲区以供上传。

生成的结构体还实现了bytemuck::Zeroablebytemuck::Pod,以便与其他库一起使用。

Crevice类似于glsl-layout,但支持许多数学crate中的类型,可以生成从结构体到GLSL的源代码,并显式初始化填充以消除未定义行为的一个来源。

Crevice通过功能标志支持许多Rust数学库,以及通过使用mint crate的绝大多数数学库。Crevice目前支持

  • mint 0.5,默认启用
  • cgmath 0.18,使用cgmath功能
  • nalgebra 0.31,使用nalgebra功能
  • glam 0.23,使用glam功能

欢迎PR添加或更新Crevice中的数学库。

如果您的数学库不受支持,则可以通过使用mint类型来定义结构体并将您的数学库的类型转换为mint类型来实现。大多数Rust数学库都支持此操作。

您的数学库可能需要您启用功能标志以获取mint支持。例如,cgmath需要启用“mint”功能以允许转换为和从mint类型。

示例

单个值

可以通过派生AsStd140并使用as_std140as_bytes将结果转换为字节来上传多个类型。

uniform MAIN {
    mat3 orientation;
    vec3 position;
    float scale;
} main;
use crevice::std140::AsStd140;

#[derive(AsStd140)]
struct MainUniform {
    orientation: mint::ColumnMatrix3<f32>,
    position: mint::Point3<f32>,
    scale: f32,
}

let value = MainUniform {
    orientation: [
        [1.0, 0.0, 0.0],
        [0.0, 1.0, 0.0],
        [0.0, 0.0, 1.0],
    ].into(),
    position: [1.0, 2.0, 3.0].into(),
    scale: 4.0,
};

let value_std140 = value.as_std140();

upload_data_to_gpu(value_std140.as_bytes());

顺序类型

可以使用 std140 Writer 类型上传更复杂的数据。

struct PointLight {
    vec3 position;
    vec3 color;
    float brightness;
};

buffer POINT_LIGHTS {
    uint len;
    PointLight[] lights;
} point_lights;
use crevice::std140::{self, AsStd140};

#[derive(AsStd140)]
struct PointLight {
    position: mint::Point3<f32>,
    color: mint::Vector3<f32>,
    brightness: f32,
}

let lights = vec![
    PointLight {
        position: [0.0, 1.0, 0.0].into(),
        color: [1.0, 0.0, 0.0].into(),
        brightness: 0.6,
    },
    PointLight {
        position: [0.0, 4.0, 3.0].into(),
        color: [1.0, 1.0, 1.0].into(),
        brightness: 1.0,
    },
];

let target_buffer = map_gpu_buffer_for_write();
let mut writer = std140::Writer::new(target_buffer);

let light_count = lights.len() as u32;
writer.write(&light_count)?;

// Crevice will automatically insert the required padding to align the
// PointLight structure correctly. In this case, there will be 12 bytes of
// padding between the length field and the light list.

writer.write(lights.as_slice())?;

unmap_gpu_buffer();

特性

  • std (默认): 启用基于 std::io::Write 的结构。
  • cgmath: 启用对 cgmath 类型支持。
  • nalgebra: 启用对 nalgebra 类型支持。
  • glam: 启用对 glam 类型支持。

支持的最低 Rust 版本 (MSRV)

由于使用了新的 const fn 功能,Crevice 支持 Rust 1.58.0 及更高版本。

许可证

根据您的要求,许可协议可以是以下之一:

任选其一。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交并包含在本作品中的任何贡献,都应双许可如上所述,无需任何额外条款或条件。

依赖

~1.3–3MB
~73K SLoC