如何在SSBO中设置数组的对齐方式

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

在计算着色器中,我有一个粒子的结构:

struct Particle {
    float delta;
    float start_posx;
    float start_posy;
    float start_posz;
    float restart;
    uint max_textures;
    float max_lifetime;
};

现在我想在SSBO中使用这个结构:

layout (std430, binding = 12) buffer particleBlock {
    Particle particles[];
};

我假设我的ssbo中的粒子是紧密打包的,因为所有struct成员都是4的大小。如果我将对齐设置为16:

layout (std430, binding = 12) buffer particleBlock {
    layout(align = 16) Particle particles[];
};

粒子[1]会偏移32吗?我不确定这个对齐如何适用于数组,这似乎对我不起作用。

opengl shader
1个回答
1
投票

单个数组元素不能通过align限定符对齐。只能对齐数组的开头。

GLSL - The OpenGL Shading Language 4.6; 4.4.5. Uniform and Shader Storage Block Layout Qualifiers; page 85

align限定符使每个块成员的开始具有最小字节对齐。它不会影响每个成员中的内部布局,它仍将遵循std140或std430规则。 ... 将align应用于数组时,它仅影响数组的开始,而不影响数组的内部步幅。

如果你要使用std140限定符,那么struct Particle的数组的步幅为32,因为步长向上舍入为vec4的基本对齐的倍数,即16。

注意,std140和std340标准之间的主要区别在于,对于std340,数组元素的步幅不会向上舍入为16字节的倍数。

如果struct Particle的大小应该是32个字节,那么你可以在最后添加一个虚拟成员:

struct Particle {
    float delta;        //  0
    float start_posx;   //  4
    float start_posy;   //  8
    float start_posz;   // 12
    float restart;      // 16
    uint  max_textures; // 20
    float max_lifetime; // 24
    float dummy;        // 28: dummy member for the alignment
};
© www.soinside.com 2019 - 2024. All rights reserved.