XNA数学库中的XMVECTOR

来源:互联网 发布:七格格淘宝 编辑:程序博客网 时间:2024/06/05 00:04

一.XNA介绍

XNA数学库在DX11中引入,与之前版本的3D数学库D3DXMAth功能基本一致,作为DXSDK的一部分。目前推荐使用XNA数学库,因为其建立在SIMD指令上,以更好的利用Windows及XBox360上特殊的硬件寄存器(128位,可以同时操作4个32位数)。为了使用XNA数学库,需要包含头文件xnamath.h。该库支持Windows及XBox平台。

二.XNA的向量类型

在Windows平台下,XNA数学库是基于SSE/SSE2指令集实现的。在XNA数学库中,XMVECTOR是向量表示的基础类型,代表一个由4个float值组成的向量。然而,为了支持较好的平台可移植性和各种优化,XMVECTOR被设计的较难理解,他的集体实现的平台相关的。Windows下,其定义为:

typedef _m128 XMVECTOR;

_128是一个针对一个可映射至其中一个SIMD寄存器(XMM[0]~XMM[7])的变量的定义,可以使用SIMD内嵌汇编语言或者使用instrinsics函数库利用寄存器对齐进行高效的操作。

在操作向量时,XMVECTOR除了用于4维向量外,还可以用于操作2维、三维向量,以于多出的几维默认为0。此外要注意的是,XMVECTOR在内存中是16位对齐的,当作为局部或全局变量使用时,由硬件自动实现对齐。对于类中的成员变量,则推荐使用XMFLOAT2(2D), XMFLOAT3(3D), XMFLOAT4(4D)来代替XMVECTOR。

三.Load和Store函数

但是,如果直接使用XMFLOAT2、XMFLOAT3等这些类型进行计算,是不会利用到SIMD指令的加速效果的,因此在计算前要把这些向量转换为XMVECTOR,然后再进行各种向量运算。这几种类型与XMVECTOR之间的相互转换函数主要分为Store和Load两种,Store型用来把一个XMVECTOR存储到指定的XMFLOATx中,Load型用来从一个XMFLOATx读取内容到XMVECTOR中。总结下这段话内容,即:

1. 在局部、全局变量中使用XMVECTOR类型;

2. 在类中定义向量成员时,使用类型XMFLOAT2,XMFLOAT3,XMFLOAT4;

3. 对类中的向量进行运算时,用Load型函数把相应向量读取到XMVECTOR中,再进行运算;

4. 运算完后把相应的结果XMVECTOR通过Store型函数存储到相应的XMFLOATx向量中。

四.获得XMVECTOR的分量的Set和Get函数

由于XMVECTOR映射为一个特殊的SIMD寄存器,而不是一个struct,因此我们不能直接操作其x,y,z,w维数据,因此提供了几个Set和Get函数.

五.XMVECTOR类型参数传递规定

为了更好地利用SIMD,当XMVECTOR作为函数参数类型时,有特殊的规定。这些规则与平台相关,比如在32位和64位的Windows及XBox360下规则就不一样。为了在写代码时与平台无关,XNA Math专门针对函数参数类型定义了这两个类型:CXMVECTOR和FXMVECTOR。在不同的平台下这两个类型有着相应的不同的定义,对于程序员在写代码时则无需考虑这些,只要服从相应的规则即可。规则如下:        

在一个函数中,前三个使用到XMVECTOR类型的参数,必须为FXMVECTOR;之后所有其他的XMVECTOR类型参数要为CXMVECTOR。比如:

XMINLINE XMMATRIX XMMatrixTransformation(
  FXMVECTOR ScalingOrigin,     //第1个XMVECTOR类型参数
  FXMVECTOR ScalingOrientationQuaternion,    //第2个XMVECTOR类型参数
  FXMVECTOR Scaling,      //第3个XMVECTOR类型参数
  CXMVECTOR RotationOrigin,     //第4个开始,后面的全部为CXMVECTOR类型
  CXMVECTOR RotationQuaternion,
  CXMVECTOR Translation); 


XMINLINE XMMATRIX XMMatrixTransformation2D(
  FXMVECTOR ScalingOrigin,     //第1个XMVECTOR类型参数
  FLOAT   ScalingOrientation,
  FXMVECTOR Scaling,      //第2个XMVECTOR类型参数
  FXMVECTOR RotationOrigin,     //第3个XMVECTOR类型参数
  FLOAT   Rotation,
  CXMVECTOR Translation);      //第4个,必须使用CXMVECTOR

六.常量向量

当用到常量型的XMVECTOR时,应该使用XMVECTORF32类型,尤其是当使用初始化式时。XMVECTORF32是16字节对齐的数据结构,可以转换为XMVECTOR类型。

例如:

const XMVECTORF32 g_Zero = {0.f,0.f,0.f,0.f};
static const XMVECTORF32 g_tmp = {x,y,z,w};

因此,如果想事先定义一些常量型的XMVECTOR,则可以用const XMVECTORF32类型来定义,在程序中用到XMVECTOR类型时,再利用类型转换(static_cast)转换为XMVECTOR类型即可。







0 0