在计算着色器中,我有一个粒子的结构:
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吗?我不确定这个对齐如何适用于数组,这似乎对我不起作用。
单个数组元素不能通过align
限定符对齐。只能对齐数组的开头。
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
};