(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~)
不知你是否还有印象,在上一篇中提到三种光源的结构体时,无论是C++中的定义还是HLSL中的定义,都存在着名为"unused"的成员(平行光和点光源)。如下为C++程序中对平行光的定义:
//平行光
struct DirLight
{
XMFLOAT4 ambient; //环境光
XMFLOAT4 diffuse; //漫反射光
XMFLOAT4 specular; //高光
XMFLOAT3 dir; //光照方向
float unused; //用于与HLSL中"4D向量"对齐规则匹配
};
显然,从名字上可以直接看出,这些成员没有任何意义,我们仅仅用这些成员来填充内存,以满足我们特定的内存对齐要求。这就涉及到HLSL中特殊的内存对齐的规则。
注意区别C++程序中的”内存“与HLSL程序的”内存“。
1. HLSL中的内存对齐
先来了解一下HLSL中的对齐要求:在HLSL中,内存布局是以"4D向量“为单位的,所有的数据类型都必须位于一个“4D向量”对应的内存当中,且同一个数据不允许跨越两个4D向量而存放。
这样的表述可能比较晦涩,通过下面的例子来理解一下:
考虑这样一个结构体:
struct Test
{
float3 f1;