(注:【D3D11游戏编程】学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~)
一、XNA Math简介
在D3D10及之前的版本中,3D数学库是伴随在D3DX库中的。在D3D11版中,3D数学库被单独隔离出来,为XNA Math库,功能和之前基本一样,但是建立在SIMD指令上,以更好地利用Windows及XBox360上特殊的硬件寄存器(128位,可以同时操作4个32位数)。
二、向量类型
在XNA数学库中,核心的向量类型为XMVECTOR,它正好映射为SIMD硬件上的128位寄存器,以利用一个指令同时操作4个32位的数。当SEE2指令集可用时,可以定义为:
typedef __m128 XMVECTOR;
在操作向量时,XMVECTOR除了用于4维向量外,还可以用于操作2维、三维向量,以于多出的几维默认为0,不关心即可。
此外要注意的是,XMVECTOR在内存中是16位对齐的,当作为局部或全局变量使用时,由硬件自动实现对齐。对于类中的成员变量,则推荐使用XMFLOAT2(2D), XMFLOAT3(3D), XMFLOAT4(4D)来代替XMVECTOR,定义分别如下:
typedef struct _XMFLOAT2
{
FLOAT x;
FLOAT y;
} XMFLOAT2;
typedef struct _XMFLOAT3
{
FLOAT x;
FLOAT y;
FLOAT z;
} XMFLOAT3;
typedef struct _XMFLOAT4
{
FLOAT x;
FLOAT y;
FLOAT z;
FLOAT w;
} XMFLOAT4;
但是,如果直接使用XMFLOAT2、XMFLOAT3等这些类型进行计算,是不会利用到SIMD指令的加速效果的,因此在计算前要把这些向量转换为XMVECTOR,然后再进行各种向量运算。这几种类型与XMVECTOR之间的相互转换函数主要分为Store和Load两种,Store型用来把一个XMVECTOR存储到指定的XMFLOATx中,Load型用来从一个XMFLOATx读取内容到XMVECT