#std140 #alignment #graphics #shaders #gamedev

无-std shader-types

适用于在 std140 统一变量中使用的正确对齐的向量和矩阵类型

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

MIT OR Apache-2.0 OR Zlib

25KB
337

shader-types

GitHub Workflow Status Crates.io Documentation License

请勿使用此库

此方法定义填充存在根本性缺陷。此库保持活跃状态,仅为了向后兼容而未撤回。对于具有相同目的的库,请查看出色的 glsl-layout,它不受相同问题的困扰。

旧版自述文件

适用于在 std140 统一变量中使用的正确对齐的向量和矩阵类型。

此库中所有类型在默认模式(std140)下与等效的 glsl 类型的对齐和大小相同。

这解决了结构体成员内的填充,但需要注意成员间的填充。在 padding 中的类型有助于简化此过程。

向量可以从其底层类型的数组构建/解构。矩阵可以从 1d 和 2d 数组以及底层 向量 类型的数组构建/解构。(例如,Mat2 可以从 [Vec2; 2] 构建)

功能

  • bytemuck 所有类型实现 ZeroablePod
  • 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