Dan*_*ter 4 opengl graphics shader render
根据规格:
如果成员是标量或向量数组,则根据规则(1)、(2)和(3),将基本对齐 + * 和数组步幅设置为匹配单个 + * 数组元素的基本对齐,并将 + * 向上舍入到 vec4 的基本对齐方式。数组可能在 + * 端有填充;数组后面的成员的基本偏移量向上舍入 + * 到基本对齐的下一个倍数。
这是否意味着如果我有一个大小为 3 的 (float)vec3 数组,它会是
vec3,vec3,vec3, (12 个空字节达到 vec4 的倍数), (16 个空字节因为最后一句)
或者
vec3, (4 个空字节),vec3,(4 个空字节)vec3,(4 个空字节), (16 个空字节因为最后一句)
从实际的 OpenGL 规范,版本 4.3 (PDF):
3:如果成员是一个三分量向量,分量消耗N个基本机器单元,则基对齐为4N。
4:如果成员是标量或向量数组,则根据规则(1)、(2)、(3),将基对齐和数组步幅设置为匹配单个数组元素的基对齐,并向上取整到 vec4 的基本对齐。数组的末尾可能有填充;数组后面成员的基本偏移量向上舍入为基本对齐的下一个倍数。
所以 avec3的基本对齐为 4*4。vec3因此,'s数组的基本对齐和数组步长是 4*4。步幅是从一个元素到下一个元素的字节数。所以每个元素的大小为 16 个字节,前 12 个是实际vec3数据。
最后,末尾的填充等于基本对齐,因此那里有空白空间。
或者,在图表形式中,avec3[3]看起来像这样:
|#|#|#|0|#|#|#|0|#|#|#|0|
Run Code Online (Sandbox Code Playgroud)
其中每个单元格为 4 个字节,#是实际数据,0是未使用的数据。