我一直在阅读关于OpenGL Superbible第6版中的std140 Uniform块,其中在第111页中给出了以下示例:
layout(std140) uniform TransformBlock
{
//Member base alignment offset aligned offset
float scale ; // 4 0 0
vec3 translation; // 16 4 16
float rotation[3]; // 16 28 32 (rotation[0])
// 48 (rotation[1])
// 64 (rotation[2])
mat4 projection_matrix; // 16 80 80 (column 0)
// 96 (column 1)
// 112 (column 2)
// 128 (column 3)
}
我很难理解对齐,即使使用该页面前面描述的规则,它仍然没有意义。让我感到困惑的具体事情是:
什么是偏移量和对齐的偏移量,为什么有2个不同的偏移?
为什么rotation [0]偏移量从28开始,为什么对齐偏移量为32?
希望有人能清除我的困惑。我将非常感激。 感谢
答案 0 :(得分:2)
什么是偏移
如果不是因为对齐要求,变量将具有的字节偏移量。
和对齐的偏移量,
它实际上具有的字节偏移量。
为什么2个不同的偏移?
因为如果变量具有不同的对齐要求,那么实际的偏移量将是不同的。例如,给定上面的代码,translation
由于其对齐要求而具有16的对齐偏移量。但是,如果translation
为float
,那么它的对齐偏移量为4.如果是vec2
,则其对齐偏移量为8。
为什么rotation [0]偏移量从28开始,
因为vec3
(something you should never use)是3个浮点数。
为什么对齐的偏移是32?
因为在std140规则下,任何数组的基本对齐,无论其元素的类型如何,总是向上舍入到vec4
的对齐。 AKA:16个字节。