对不起,标题,但是我真的不知道该如何命名我的问题。 我在读一本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的偏移相同。
有人可以像我一个白痴一样向我解释吗?
答案 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 vec3
s 。