首页 > 解决方案 > 我需要关于 std140 统一块偏移的解释

问题描述

对不起标题,但我真的不知道如何命名我的问题。我正在阅读一本 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;

我知道vec3' 对齐 = vec4' 对齐 = 32 位。

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

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

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

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

与 projection_matrix 的偏移量相同。

谁能像我是个白痴一样向我解释一下,好吗?

标签: c++opengl

解决方案


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


推荐阅读