4 个版本
0.2.2 | 2020 年 8 月 30 日 |
---|---|
0.2.1 | 2020 年 8 月 24 日 |
0.2.0 | 2020 年 7 月 16 日 |
0.1.0 | 2020 年 7 月 12 日 |
#7 in #std140
25KB
337 行
shader-types
请勿使用此库
此方法定义填充存在根本性缺陷。此库保持活跃状态,仅为了向后兼容而未撤回。对于具有相同目的的库,请查看出色的 glsl-layout
,它不受相同问题的困扰。
旧版自述文件
适用于在 std140 统一变量中使用的正确对齐的向量和矩阵类型。
此库中所有类型在默认模式(std140)下与等效的 glsl 类型的对齐和大小相同。
这解决了结构体成员内的填充,但需要注意成员间的填充。在 padding
中的类型有助于简化此过程。
向量可以从其底层类型的数组构建/解构。矩阵可以从 1d 和 2d 数组以及底层 向量 类型的数组构建/解构。(例如,Mat2
可以从 [Vec2; 2]
构建)
功能
bytemuck
所有类型实现Zeroable
和Pod
。mint
启用与等效 mint 类型的转换。
示例
以下 glsl
layout(set = 0, binding = 0) uniform Block {
mat4 mvp;
vec3 position;
vec3 normal;
vec2 uv;
int constants[3];
};
此结构体充满了填充。但现在很容易注意填充
use shader_types::{Vec2, Vec3, Mat4, ArrayMember};
// Definition
#[repr(C)]
#[derive(Copy, Clone)]
struct UniformBlock {
mvp: Mat4, // 16 align + 64 size
position: Vec3, // 16 align + 12 size
normal: Vec3, // 16 align + 12 size
uv: Vec2, // 8 align + 8 size
constants: [ArrayMember<i32>; 3] // 3x 16 align + 4 size
}
fn generate_mvp() -> [f32; 16] {
// ...
}
// Construction
let block = UniformBlock {
// Anything that can be converted to a [f32; 16] or [[f32; 4]; 4] works
mvp: Mat4::from(generate_mvp()),
position: Vec3::new([0.0, 1.0, 2.0]), // `from` also works
normal: Vec3::new([-2.0, 2.0, 3.0]),
uv: Vec2::new([0.0, 1.0]),
constants: [ArrayMember(0), ArrayMember(1), ArrayMember(2)]
};
// Supports bytemuck with the `bytemuck` feature
unsafe impl bytemuck::Zeroable for UniformBlock {}
unsafe impl bytemuck::Pod for UniformBlock {}
let block_u8: &[u8] = bytemuck::cast_slice(&[block]);
MSRV
Rust 1.34
许可证:MIT OR Apache-2.0 OR Zlib
依赖关系
~39KB