В GLSL требуется, чтобы vec3
был выровнен по 16-байтовой границе при использовании в однородном блоке. Чтобы представить это требование, у меня есть тип Rust, определенный следующим образом:
#[repr(C, align(16))]
struct UniformVec3([f32; 3]);
Это упрощает создание однородных данных на стороне ЦП без необходимости вручную указывать отступы. Однако, чтобы загрузить данные в графический процессор, структура должна быть преобразована в &[u8]
, например:
let v = UniformVec3([1.0, 0.0, 0.0]);
unsafe {
let as_bytes = std::slice::from_raw_parts(
(&v as *const UniformVec3) as *const u8,
std::size_of::<UniformVec3>(),
);
// do stuff with as_bytes...
}
В существующем виде это поведение undefined, поскольку битовый шаблон четыре байта заполнения не определены. У меня вопрос: есть ли способ инициализировать эту структуру (с ее текущим определением!) Без вызова UB при преобразовании ее в &[u8]
? Или мне нужно вставить явное заполнение в структуру, которая будет определена при инициализации?