4

根据规格

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

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

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

或者

vec3, (4 empty bytes),vec3,(4 empty bytes)vec3,(4 empty bytes), (16 empty bytes 因为最后一句话)

4

2 回答 2

5

来自实际的 OpenGL 规范,版本 4.3 (PDF)

3:如果成员是一个三分量向量,其分量消耗 N 个基本机器单元,则基本对齐为 4N。

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

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

最后,最后有等于基本对齐的填充,因此有空白空间。

或者,以图表的形式,avec3[3]看起来像这样:

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

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

于 2013-03-25T14:21:41.920 回答
1

Neither.

The appendix L from the redbook states this:

  • An array of scalars or vectors -> Each element in the array is the size of the underlying type (sizeof(vec4) for vec3), and the offset of any element is its index (using zero-based indexing) times the elements size (again sizeof(vec4)). The entire array is padded to be a multiple of the size of a vec4.

So the correct answer is vec3, (4 empty), vec3, (4 empty),vec3, (4 empty) -> 48 bytes

于 2013-03-25T13:50:47.437 回答