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

时间:2013-03-25 13:47:19

标签: opengl graphics shader render

根据specification

  

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

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

vec3,vec3,vec3,(12个空字节到达vec4倍数),(由于最后一句话有16个空字节)

vec3,(4个空字节),vec3,(4个空字节)vec3,(4个空字节),(由于最后一个句子,16个空字节)

2 个答案:

答案 0 :(得分:3)

来自实际 OpenGL Specification, version 4.3 (PDF)

  

3:如果成员是三分量向量,其中组件消耗N.   基本机器单元,基准线是4N。

     

4:如果成员是标量或向量的数组,则为基本对齐和数组   根据,stride被设置为匹配单个数组元素的基本对齐   规则(1),(2)和(3),并向上舍入到vec4的基本对齐。该   数组末尾可能有填充;以下成员的基本偏移量   数组向上舍入到基本对齐的下一个倍数。

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

最后,有一个填充等于最后的基本对齐,所以有空的空格。

或者,在图表形式中,vec3[3]看起来像这样:

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

每个单元格为4个字节,#为实际数据,0为未使用数据。

答案 1 :(得分:1)

都不是。

红皮书中的appendix L说明了这一点:

  • 一系列标量或向量 - &gt;数组中的每个元素都是基础类型的大小(vec3 的 sizeof(vec4)),任何元素的偏移量都是其索引(使用从零开始的索引)乘以元素大小(< em>再次sizeof(vec4))。整个数组填充为vec4大小的倍数。

所以正确答案是vec3,(4空),vec3,(4空),vec3,(4空) - &gt; 48字节