HLSL中constant variables的packing规则
HLSL中constant variables的packing规则
参考MSDN上的官方文档。一般而言,HLSL将数据打包为4字节对齐,此外,它不允许数据跨16字节(即4个float的vector)的访问。这个“此外”是我比较关心的,对使用者最直接的影响就是用constant buffer进行应用程序和shader间的交互的时候,应用程序这边的数据也要手动做符合16字节的对齐规则。比如在shader里面写:
cbuffer constantValues
{
float2 Val0;
float4 Val1;
float2 Val2;
};
它实际上会占用3个16字节那么大的空间,C++这边对应的结构可以这样:
struct ConstantBufferType
{
vectorOfFloat2 val0;
float pad0;
float pad1;
vectorOfFloat4 val1;
vectorOfFloat2 val2;
float pad2;
float pad3;
};
如果naive地写:
struct ConstantBufferType
{
vectorOfFloat2 val0;
vectorOfFloat4 val1;
vectorOfFloat2 val2;
};
就挂了。
最后,HLSL中的数组默认是不packing的,每个元素都直接被装在16字节的空间中,想packing的话就需要精心地安排数据存储并在shader中用强转或者自己算偏移量之类的方式来取用。