关于布局std140均匀块阵列的OpenGL(Regarding arrays in layout

2019-07-23 06:09发布

据规格 :

如果部件是标量或向量的阵列,基部对准+ *和阵列步幅被设置为单个+ *数组元素的基础对准匹配,根据规则(1),(2),和(3),并且四舍五入+ *到vec4的基部对准。 所述阵列可以具有在+ *结束填充; 基座阵列以下的部件的偏移量被向上舍入+ *到基部对准的下一个倍数。

这是否意味着,如果我有一个(浮动)VEC 3的大小为3的数组,那会是

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

要么

VEC3,(4个空字节),VEC 3,(4个空字节)VEC3,(4个空字节),(因为最后一句16个空字节)

Answer 1:

实际 的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是未使用的数据。



Answer 2:

都不是。

该附录L.从红皮书状态这样的:

  • 标量或向量的阵列- >数组中的每个元素是基本类型( 的sizeof(vec4)为VEC3)的大小,和所述的任何元件的偏移量是它的索引(使用从零开始的索引)倍的元件尺寸( 再次的sizeof(vec4))。 整个阵列被填充成为vec4的大小的倍数。

因此,正确答案是VEC3,(4空),VEC 3,(4空),VEC 3,(4空) - > 48个字节



文章来源: Regarding arrays in layout std140 uniform block for OpenGL