一、XMVECTOR简介
XNAMath 是DirectX11后新加入的一个数字格式库,建立在SIMD指令集上。
在XNA数字库中核心向量是XMVECTOR
因为XMVECTOR是直接映射SIMD硬件上的128位寄存器,所以其他变量需要做运算时,需要全部转换成XMVECTOR形式再进行运算最后得出结果再转换成目标类型。
定义为:
typedef __m128 XMVECTOR;
还有其他的诸如 XMFLOAT2,XMFLOAT3,XMFLOAT4,这些变量便可以按需要在类成员中设定
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;
数字库中的类型使用大致规则如下:
1. 在局部、全局变量中使用XMVECTOR类型;
2. 在类中定义向量成员时,使用类型XMFLOAT2,XMFLOAT3,XMFLOAT4;
3. 对类中的向量进行运算时,用Load型函数把相应向量读取到XMVECTOR中,再进行运算;
4. 运算完后把相应的结果XMVECTOR通过Store型函数存储到相应的XMFLOATx向量中。
二,XMVECTOR的使用规定
1,当XMVECTOR在函数中作为参数传入时,规定前三个XMVECTOR类型必须为FXMVECTOR,往后的所有XMVECTOR类型为CXMVECTOR,这样规定有利于运行效率,不必深究
2,定义常量XMVECTOR数据是,应使用XMVECTOR32型,即:
const XMVECTOR32 g={0.f,0.f,0.f,0.f}
三,一些基本级XMVECTOR操作函数和Setter函数
Setter函数
XMVECTOR XMVectorZero(); //[0,0,0,0]
XMVECTOR XMVectorSplatOne(); //[1.f, 1.f, 1.f, 1.f]
XVMECTOR XMVectorSet(FLOAT x, FLOAT y, FLOAT z, FLOAT w); //[x,y,z,w]
XMVECTOR XMVectorReplicate(FLOAT s); //[s, s, s, s]
XMVECTOR XMVectorSplatX(FXMVECTOR v); //[v.x, v.x, v.x, v.x]
XMVECTOR XMVectorSplatY(FXMVECTOR v); //[v.y, v.y, v.y, v.y]
XMVECTOR XMVectorSplatZ(FXMVECTOR v); //[v.y, v.y, v.y, v.y]
操作函数
XMVECTOR XMVector3Length(FXMVECTOR v); //长度L,结果为[L,L,L,L],效率起见,全部为XMVECTOR类型,我们只取一个维即可。
XMVECTOR XMVector3LengthSq(FXMVECTOR v); //长度L平方根,结果存放同上。其他任何返回scalar数的同理
XMVECTOR XMVector3Dot(FXMVECTOR v1, FXMVECTOR v2); //点积dot,[dot, dot, dot, dot]
XMVECTOR XMVector3Cross(FXMVECTOR v1, FXMVECTOR v2); //叉乘
XMVECTOR XMVector3Normalize(FXMVECTOR v); //归一化
XMVECTOR XMVector3Orthogonal(FXMVECTOR v); //返回一个垂直的向量
XMVECTOR XMVector3AngleBetweenVectors(FXMVECTOR v1, FXMVECTOR v2); //返回两向量间角度angle,[angle, angle, angle, angle]
XNAMath 是DirectX11后新加入的一个数字格式库,建立在SIMD指令集上。
在XNA数字库中核心向量是XMVECTOR
因为XMVECTOR是直接映射SIMD硬件上的128位寄存器,所以其他变量需要做运算时,需要全部转换成XMVECTOR形式再进行运算最后得出结果再转换成目标类型。
定义为:
typedef __m128 XMVECTOR;
还有其他的诸如 XMFLOAT2,XMFLOAT3,XMFLOAT4,这些变量便可以按需要在类成员中设定
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;
数字库中的类型使用大致规则如下:
1. 在局部、全局变量中使用XMVECTOR类型;
2. 在类中定义向量成员时,使用类型XMFLOAT2,XMFLOAT3,XMFLOAT4;
3. 对类中的向量进行运算时,用Load型函数把相应向量读取到XMVECTOR中,再进行运算;
4. 运算完后把相应的结果XMVECTOR通过Store型函数存储到相应的XMFLOATx向量中。
二,XMVECTOR的使用规定
1,当XMVECTOR在函数中作为参数传入时,规定前三个XMVECTOR类型必须为FXMVECTOR,往后的所有XMVECTOR类型为CXMVECTOR,这样规定有利于运行效率,不必深究
2,定义常量XMVECTOR数据是,应使用XMVECTOR32型,即:
const XMVECTOR32 g={0.f,0.f,0.f,0.f}
三,一些基本级XMVECTOR操作函数和Setter函数
Setter函数
XMVECTOR XMVectorZero(); //[0,0,0,0]
XMVECTOR XMVectorSplatOne(); //[1.f, 1.f, 1.f, 1.f]
XVMECTOR XMVectorSet(FLOAT x, FLOAT y, FLOAT z, FLOAT w); //[x,y,z,w]
XMVECTOR XMVectorReplicate(FLOAT s); //[s, s, s, s]
XMVECTOR XMVectorSplatX(FXMVECTOR v); //[v.x, v.x, v.x, v.x]
XMVECTOR XMVectorSplatY(FXMVECTOR v); //[v.y, v.y, v.y, v.y]
XMVECTOR XMVectorSplatZ(FXMVECTOR v); //[v.y, v.y, v.y, v.y]
操作函数
XMVECTOR XMVector3Length(FXMVECTOR v); //长度L,结果为[L,L,L,L],效率起见,全部为XMVECTOR类型,我们只取一个维即可。
XMVECTOR XMVector3LengthSq(FXMVECTOR v); //长度L平方根,结果存放同上。其他任何返回scalar数的同理
XMVECTOR XMVector3Dot(FXMVECTOR v1, FXMVECTOR v2); //点积dot,[dot, dot, dot, dot]
XMVECTOR XMVector3Cross(FXMVECTOR v1, FXMVECTOR v2); //叉乘
XMVECTOR XMVector3Normalize(FXMVECTOR v); //归一化
XMVECTOR XMVector3Orthogonal(FXMVECTOR v); //返回一个垂直的向量
XMVECTOR XMVector3AngleBetweenVectors(FXMVECTOR v1, FXMVECTOR v2); //返回两向量间角度angle,[angle, angle, angle, angle]