我需要有关std140均匀块偏移的说明

时间:2019-04-30 18:24:52

标签: 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;

我知道vec3的对齐方式= vec4的对齐方式= 32位。

比例是第一个分量,所以偏移量是0,也是4位,所以对我来说很明显,翻译必须在-我们将其称为currentPosition-currentPosition +4。

我不明白为什么平移的偏移量的对齐方式是16。

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

翻译为vec3,表示有3个float,因此3 * 4 = 12。 我首先想到的是,我们可能想将其四舍五入为a,我不知道如何称呼它为bit值,但是28不是那种值。

与projection_matrix的偏移相同。

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

1 个答案:

答案 0 :(得分:5)

OpenGL没有定义称为“偏移对齐”的概念。也许您的书谈论的是一些衍生数量,但是由于您没有为书命名,也没有引用任何其他例子,所以我不能说。

关于std140布局,值得的数量是大小(占用多少空间),基本对齐方式,偏移量和数组步长(显然仅对数组有意义)。基本对齐方式对偏移量施加了限制;偏移量必须可通过基本对齐方式整除。

vec3的大小为12,因为它包含3个4字节值。它的基本对齐方式为16,因为这就是标准所说的内容:

  

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

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

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

rotation的基本对齐方式和数组跨度为16,因为这就是标准所说的:

  

如果成员是标量或向量的数组,则基本比对和数组   跨度设置为匹配单个数组元素的基本对齐方式   规则(1),(2)和(3),并四舍五入到vec4 的基本对齐方式。

已添加重点。

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

也是 stop using vec3s