今天创建constantBuffer给shader使用时一直不成功:
struct LightStruct
{
XMFLOAT4 lightColor;
XMFLOAT3 lightDir;
// float ss;//
};
createBuffer时,constant lightStruct的buffer一直vptr什么异常, lightStruct的sizeof为28而不是32(我原以为lightstruct的大小会使XMFLOAT4的倍数)。
3)结构体总大小为结构体最宽基本类型大小的整数倍。(而XMFLOAT4基本类型为float),所以最终为28
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
struct MyStruct
{
char dda;//偏移量为0,满足对齐方式,dda占用1个字节;
double dda1;//下一个可用的地址的偏移量为1,不是sizeof(double)=8的倍数,需要补足7个字节才能使偏移量变为8(满足对齐方式,因此VC自动填充7个字节,dda1存放在偏移量为8的地址上,它占用8个字节
int type;//下一个可用的地址的偏移量为16,是sizeof(int)=4的倍数,满足int的对齐方式,所以不需要VC自动填充,type存放在偏移量为16的地址上,它占用4个字节。
};//所有成员变量都分配了空间,空间总的大小为1 7 8 4=20,不是结构的节边界数(即结构中占用最大空间的类型所占用的字节数sizeof 字串2(double)=8)的倍数,所以需要填充4个字节,以满足结构的大小为
//sizeof(double)=8的倍数。
所以该结构总的大小为:sizeof(MyStruc)为1 7 8 4 4=24。其中总的有7 4=11个字节是VC自动填充的,没有放任何有意义的东西。