我在glsl SSBO中有以下结构数组。
struct node {
vec3 min, max;
int hitNext;
int missNext;
int firstTri, numTris;
};
layout(std430, binding = 3) readonly buffer Nodes {
node[] nodes;
};
我把一个字节缓冲区传给他们,我把数据按以下格式存储在那里。
4 bytes min.x, 4 bytes min.y, 4 bytes min.z, 4 bytes 1.0f,
4 bytes max.x, 4 bytes max.y, 4 bytes max.z, 4 bytes 1.0f,
4 bytes hitNext, 4 bytes missNext, 4 bytes firstTrue, 4 bytes numTris
但glsl没有正确读取数据。如果我改变 vec3
结构定义中的 vec4
它的工作原理是完美的。但为什么会这样呢?根据OpenGL的规范,这不就是对齐方式吗?
struct node { //Base alignment Aligned Offset
vec3 min; // 16 0
vec3 max; // 16 16
int hitNext; // 4 32
int missNext; // 4 36
int firstTri, numTris; // 4 40
// 4 44
};
layout(std430, binding = 3) readonly buffer Nodes {
node[] nodes; // 16 48
};
但这个对齐方式和我传入的数据是一致的 为什么这不能工作,而 vec4
工作?
struct node { //Base alignment Aligned Offset vec3 min; // 16 0 vec3 max; // 16 16 int hitNext; // 4 32
不对,规范上不是这么说的。A vec3
可能只是需要 排列 的16个字节,但它不 消耗 16个字节。由于后面元素的基本对齐方式只有4,所以我们最终得到的对齐偏移量是 28
对于 hitNext
.
这只是另一个例子 这个问题.