2个不稳定版本
0.13.0 | 2023年4月24日 |
---|---|
0.11.0 | 2022年7月10日 |
#522 in Rust模式
每月740次下载
在15个crate中使用(通过notan_graphics)
60KB
1K SLoC
Crevice
Crevice的分支,用于在notan
内部使用,因为派生宏不能重新导出。
Crevice通过派生宏的强大功能创建与GLSL兼容的类型版本。生成的结构体提供as_bytes
方法,允许安全地将数据打包到缓冲区以供上传。
生成的结构体还实现了bytemuck::Zeroable
和bytemuck::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_std140
和as_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 License,版本 2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交并包含在本作品中的任何贡献,都应双许可如上所述,无需任何额外条款或条件。
依赖
~1.3–3MB
~73K SLoC