在计算着色器中,我有一个粒子的结构:
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中被紧密地压缩,因为所有的结构成员都是4。如果我将对齐设置为16:
layout (std430, binding = 12) buffer particleBlock {
layout(align = 16) Particle particles[];
};particles1是否会被抵消32?我不知道数组是如何对齐的,这似乎不适用于我。
发布于 2018-09-14 12:30:39
单个数组元素不能由align限定符对齐。只能对齐数组的开始。
GLSL - OpenGL阴影语言4.6;4.4.5。统一和着色存储块布局限定符;第85页:
对齐限定符使每个块成员的开始具有最小字节对齐。它不影响每个成员的内部布局,而内部布局仍将遵循std140或std430规则。 ..。 当应用于数组时,它只影响数组的开始,而不影响数组的内部步长.
如果要使用std140限定符,那么struct Particle的数组将具有32的步长,因为该步长被舍入到vec4的基对齐倍数,即16。
注意,std140和 std430 标准之间的一个主要区别是,在std430情况下,数组元素的跨距不会舍入到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
};https://stackoverflow.com/questions/52328129
复制相似问题