我在着色器中的 GLSL 中有一个存储缓冲区:
struct DeviceSideTerrainPatchInfo
{
ivec3 terrain_patch_pos_int;
uint buffer_idx;
vec3 terrain_patch_pos_frac;
uint buffer_offset;
};
layout (std430, set = 2, binding = 2) readonly buffer TerrainInfoArray
{
DeviceSideTerrainPatchInfo terrain_info_array[];
};
这很好,每个元素都是 32 字节大,并且索引很好。不过,我向结构中添加了一个额外的成员:
struct DeviceSideTerrainPatchInfo
{
ivec3 terrain_patch_pos_int;
uint buffer_idx;
vec3 terrain_patch_pos_frac;
uint buffer_offset;
uint extra_member;
};
layout (std430, set = 2, binding = 2) readonly buffer TerrainInfoArray
{
DeviceSideTerrainPatchInfo terrain_info_array[];
};
现在,我知道在 std140 规则下,将填充到 16 的倍数,即 48。但是在 std430 规则下,没有那么严格的要求,我很确定数组的每个元素都是对齐到 36 的倍数。事实证明,我需要在主机端代码上添加另外 3 个 4 字节成员才能使其正确对齐,这意味着对于 std430,它会对齐到 48。
但是根据std430规则并没有那么严格的要求
我不知道你为什么会这么想。 规则明确规定 vec3 将对齐到元素类型对齐方式的 4 倍——因此在这种情况下您将获得 16 字节对齐。