这个数组被填充到 16 个字节有什么原因吗?

问题描述 投票:0回答:1

我在着色器中的 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。

glsl vulkan
1个回答
0
投票

但是根据std430规则并没有那么严格的要求

我不知道你为什么会这么想。 规则明确规定 vec3 将对齐到元素类型对齐方式的 4 倍——因此在这种情况下您将获得 16 字节对齐。

© www.soinside.com 2019 - 2024. All rights reserved.