[翻译]关于GLSL中std140布局中vec3和float的对齐问题

初学者在理解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;
}

在这种情况下,所有结构成员的数据类型的对齐要求自然得到满足,vec3在偏移为0的位置开始(16的倍数,即0)然后float b在偏移为12字节的位置开始,因此直接在vec3的大小12字节之后.float本身有一个4字节的对齐要求,所以它可以在vec3的12字节之后开始.

再举一个例子:

struct
{
	vec3 a;
	vec3 b;
	float c;
}

这里,vec3 a从字节0开始,由于vec3具有16字节的对齐要求,因此vec3 b将从偏移为16的字节开始,vec3 a将在其后面填充额外的4个字节,因为下一个vec3 b不能从字节偏移量12开始,这样会违反其对齐的要求,float c本身有4个字节的对齐要求,所以可以在vec3之后开始,所以字节偏移量为16+12=28.
############################################
原址:http://forum.lwjgl.org/index.php?topic=7151.0

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值