关于布局std140中的数组OpenGL统一块

关于布局std140中的数组OpenGL统一块,opengl,graphics,shader,render,Opengl,Graphics,Shader,Render,根据: 如果成员是标量或向量数组,则基对齐 +*和阵列跨距设置为与单个阵列的基准对齐相匹配 +*数组元素,根据规则(1)、(2)和(3),并向上舍入 +*与vec4的基准对齐。该数组的底部可能有填充 +*结束;数组后面的成员的基偏移向上舍入 +*到基础路线的下一个倍数 这是否意味着如果我有一个(float)vec3的大小为3的数组,它会是吗 vec3,vec3,vec3,(12个空字节达到vec4的倍数),(16个空字节是因为最后一句话) 或 vec3,(4个空字节),vec3,(4个空字节)v

根据:

如果成员是标量或向量数组,则基对齐 +*和阵列跨距设置为与单个阵列的基准对齐相匹配 +*数组元素,根据规则(1)、(2)和(3),并向上舍入 +*与vec4的基准对齐。该数组的底部可能有填充 +*结束;数组后面的成员的基偏移向上舍入 +*到基础路线的下一个倍数

这是否意味着如果我有一个(float)vec3的大小为3的数组,它会是吗

vec3,vec3,vec3,(12个空字节达到vec4的倍数),(16个空字节是因为最后一句话)

vec3,(4个空字节),vec3,(4个空字节)vec3,(4个空字节),(16个空字节,因为最后一句话)

红皮书中的说明如下:

  • 标量或向量数组->数组中的每个元素都是基础类型的大小(对于vec3为sizeof(vec4)),任何元素的偏移量都是其索引(使用基于零的索引)乘以元素大小(同样是sizeof(vec4))。整个数组被填充为vec4大小的倍数
因此,正确的答案是vec3,(4空),vec3,(4空),vec3,(4空)->48字节,与实际值相比:

3:如果成员是三分量向量,分量消耗N 基本机组,基本对准为4N

4:如果成员是标量或向量数组,则基对齐和数组 跨距设置为与单个阵列元素的基本对齐方式相匹配,根据 根据规则(1)、(2)和(3),并向上舍入到vec4的基准对齐。这个 数组末尾可能有填充;以下构件的基准偏移量: 阵列将向上舍入到基础对齐的下一个倍数

因此
vec3
的基本对齐方式为4*4。因此,
vec3
数组的基本对齐和数组跨距为4*4。跨距是从一个元素到下一个元素的字节数。因此每个元素的大小为16字节,前12个字节是实际的
vec3
数据

最后,在末端有与基准对齐方式相等的填充,因此有空的空间

或者,在图表形式中,
vec3[3]
如下所示:

|#|#|#|0|#|#|#|0|#|#|#|0| 

如果每个单元格是4个字节,
#
是实际数据,
0
是未使用的数据。

那么这句话是什么意思呢?“数组后面的成员的基偏移向上舍入到基对齐的下一个倍数。”如果块中有第二个成员,您会在示例中添加额外的[0][0][0][0],还是下一个成员的基偏移只是您的示例?@DanWebster:基偏移向上舍入。因此,如果下一个成员的基偏移量为4,则它将四舍五入到16。因此,无论下一个成员是什么,它都将始终具有至少16的基准偏移。这就是上面最后一个0所代表的;数组末尾未使用的字节,用于将下一个成员与基对齐方式对齐。