无法理解OpenGL SSBO的对齐规则 [重复]

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

我在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 工作?

opengl glsl
1个回答
3
投票
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.

这只是另一个例子 这个问题.

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