我需要有关 std140 统一块偏移的解释

1 c++ opengl

抱歉这个标题,但我真的不知道如何命名我的问题。我正在读一本 opengl 书中有关统一块的内容,我对那里显示的默认 std140 偏移量有点困惑。

layout(std140) uniform TransformBlock
{
    //component             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)
} transform;
Run Code Online (Sandbox Code Playgroud)

我知道vec3'salignment = vec4'salignment = 32 位。

比例是第一个分量,所以偏移量是 0,也是 4 位,所以我很清楚平移需要位于 - 让我们称之为 currentPosition - currentPosition + 4。

不过,我不明白为什么翻译的偏移对齐是 16。

另外,我不清楚为什么旋转的偏移量是 28。

翻译过来是vec3,意思是有3float个,所以3 * 4 = 12。我的第一个想法是我们可能想把它四舍五入到a,我不知道它怎么叫,位值,但28不是一个值那种。

与projection_matrix的偏移量相同。

有人可以像我是白痴一样向我解释一下吗?

Nic*_*las 5

OpenGL没有定义“偏移对齐”的概念。也许你的书正在谈论一些派生量,但由于你没有命名这本书,也没有引用除这个例子之外的任何内容,我不能说。

对于 std140 布局来说,重要的参数是大小(占用多少空间)、基本对齐方式、偏移量和数组步幅(显然仅对数组有意义)。基础对齐对偏移量施加了限制;偏移量必须能被基本对齐整除。

vec3大小为 12,因为它包含 3 个 4 字节值。它的碱基对齐为 16,因为标准是这么说的:

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

成员的偏移量是通过计算一个成员的偏移量、添加前一个成员的大小,然后将基本对齐应用于该值来计算的。

因此,假设 的scale偏移量为 0、大小为 4、基本对齐方式为 4,则 的偏移量translation为 16(4,向上舍入到最接近的基本对齐方式)。

的基本对齐方式和数组步长rotation是 16,因为标准是这么说的:

如果成员是标量或向量数组,则根据规则 (1)、(2) 和 (3),将基本对齐方式和数组步幅设置为匹配单个数组元素的基本对齐方式,并向上舍入为a 的基本对齐方式vec4

添加了强调。

因此, 的偏移量translation为 16,其大小为 12。将它们加在一起,得到 28。要获得 的偏移量rotation,应用 的rotation基本对齐方式,得到 32。

另外,停止使用vec3s