据规格 :
如果部件是标量或向量的阵列,基部对准+ *和阵列步幅被设置为单个+ *数组元素的基础对准匹配,根据规则(1),(2),和(3),并且四舍五入+ *到vec4的基部对准。 所述阵列可以具有在+ *结束填充; 基座阵列以下的部件的偏移量被向上舍入+ *到基部对准的下一个倍数。
这是否意味着,如果我有一个(浮动)VEC 3的大小为3的数组,那会是
VEC3,VEC3,VEC3,(12个空字节到达vec4倍数),(因为最后一句16个空字节)
要么
VEC3,(4个空字节),VEC 3,(4个空字节)VEC3,(4个空字节),(因为最后一句16个空字节)
从实际 的OpenGL规范,版本4.3(PDF) :
3:如果构件与消耗N基本机械单元组件的三个成分的矢量,基座对准为4N。
4:如果部件是标量或向量的阵列,所述基部对准和阵列步幅设定tomatch单个阵列元件的基对准,根据规则(1),(2),和(3),和舍入到vec4的基部对准。 所述阵列可以具有在端部填充; 基座阵列以下的部件的偏移量被向上舍入到基部对准的下一个倍数。
因此,一个vec3
有4 * 4基座对齐。 的阵列的基底对准和阵列步幅vec3
因此的是4×4。 步幅是一个字节从一个元件到下一个数。 因此,每个元件的尺寸为16字节,与所述第一被12实际vec3
数据。
最后,还有一个填充等于在末端的碱基对准,所以空的空间从。
或者,在图的形式,一个vec3[3]
如下所示:
|#|#|#|0|#|#|#|0|#|#|#|0|
其中每个单元为4个字节, #
是实际的数据,和0
是未使用的数据。
都不是。
该附录L.从红皮书状态这样的:
- 标量或向量的阵列- >数组中的每个元素是基本类型( 的sizeof(vec4)为VEC3)的大小,和所述的任何元件的偏移量是它的索引(使用从零开始的索引)倍的元件尺寸( 再次的sizeof(vec4))。 整个阵列被填充成为vec4的大小的倍数。
因此,正确答案是VEC3,(4空),VEC 3,(4空),VEC 3,(4空) - > 48个字节