初学者在理解GLSL布局规则时可能会感觉很困惑,通常来讲,一个数据类型的大小和这个数据类型的对齐要求是不同的,例如,vec3的大小是3个float,也就是12个字节,但是他的对齐要求是16字节.
对齐规定了给定类型的下一个值可以从多少字节的倍数开始对于vec3来说对其要求是16字节,因此每当声明一个vec3时,在vec3开始之间会填充一些字节,以确保vec3符合对齐要求.
比如:
struct
{
float a;
vec3 b;
}
此时,float将从偏移量0字节开始,但是由于vec3的对齐要求(16字节),所以在float之后和vec3之前会有填充12个字节,所以,实际上float会变成一个只有第一个分量被使用的vec4,在16个字节之后(其中float占用4个字节,填充了12个字节),才是Vec3 b.
所以在这种情况下,更高效利用空间的方式是在float之前声明vec3.
struct
{
vec3 b;
float a;