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中用强转或者自己算偏移量之类的方式来取用。

原文地址:https://www.cnblogs.com/AirGuanZ/p/7840137.html