D3D11 学习笔记(1) 初探XMVECOTR&XMMATRIX

初探DX11的数学库向量部分:
XMVECOTR,FXMVECTOR,CXMVECTOR


XMVECTOR(XNA数学库的向量)

DirectX中的一个核心数据类型为 XMVECTOR
对它的运算可以使用SIMD指令集加速(主要处理向量的运算)。
SIMD即Single Instruction Multiple Data,单指令多数据流,能够复制多个操作数,并把它们打包在大型寄存器的一组指令集。


XMVECTOR 的定义:

// Vector intrinsic: Four 32 bit floating point components aligned on a 16 byte 
// boundary and mapped to hardware vector registers
typedef __m128 XMVECTOR;

XMVECTOR是可直接映射SIMD硬件上的128位寄存器


DirectX其他定义的几个结构体例如:
二维向量XMFLOAT2(2D)
三维向量XMFLOAT3(3D)
四维向量XMFLOAT4(4D)

直接将它们计算时,由于没有SIMD的加速,所以速度相对较慢。

所以倘然将它们需要做运算时,需要全部转换成XMVECTOR形式再进行运算,最后得出结果再转换成目标类型。
那么就能让这些向量的运算允许进行SIMD加速。

转换XMVECTOR形式,我们只利用需要的维度数据来运算,而可能多出的空位(其他维度数据)被置为0不运算。

所以XNA数学库中也就有了这几个结构体和XMVECTOR互相转换的函数。


FXMVECTOR、CXMVECTOR(const XMMATRIX(&))

下面是龙书说的:
For Windows, these are defined as:

// 32-bit Windows
typedef const XMVECTOR FXMVECTOR;
typedef const XMVECTOR& CXMVECTOR; 
// 64-bit Windows
typedef const XMVECTOR& FXMVECTOR; 
typedef const XMVECTOR& CXMVECTOR;

FXMVECTOR或CXMVECTOR是DX的一种规定,
在上面代码可以看到FXMVECTOR或CXMVECTOR本质是
const XMVECTOR (&)
也就是只读性的XMVECTOR。


DirectX库中规定,任何函数
若需要传入3个以内包括3个只读性的XMVECOTR(只读性其实就是const)参数,则这些形参的类型应写
FXMVECTOR
若需要传入超过3个只读性的XMVECOTR参数,则前三个的类型应写为FXMVECTOR,超出三个的类型应写为CXMVECTOR

举个例子:

void func0(FXMVECTOR v1);
//其它类型的参数,即使夹在中间,也不参与这个规则
void func1(FXMVECTOR v1,int a,FXMVECTOR v2,int b);
//cv4,cv5超出三个只读性参数,所以需要声明改成CXMVETOR
//v6不是只读性的,不参与这个规则
void func2(FXMVECTOR cv1,FXMVECTOR cv2,FXMVECTOR cv3,CXMVECTOR cv4,CXMVECTOR cv5,XMVECTOR& v6);

那么FXMVECTOR和CXMVECTOR又有什么区别呢?

FXMVECTOR 将代表将利用SSE/SSE2寄存器传入的const XMVECTOR类型。(也就是可以通过一些硬件操作来加速传入XMVECTOR参数,F意思是代表fast吧大概= =。)
而 CXMVECTOR 只代表正常传入的const XMVECTOR类型。

如果都用CXMVECTOR,速度不如通过SIMD寄存器的FXMVECTOR
如果超过3个都用FXMVECTOR,多出的FXMVECTOR的传不进去寄存器(也许是可加速的参数数量有限)。
(还有用超过3个以上的FXMVECOTR时,编译不会报错,所以在自定义函数时,要注意FXMVECTOR参数不要超过3个,不然运行期会传不进去)


XMVECTOR各类型使用规范

  1. XMVECTOR用于局部或全局变量。
  2. XMFLOAT2, XMFLOAT3,XMFLOAT4用于类成员类型。
  3. 只对XMVECTOR做向量计算,或使用载入方法将 XMFLOAT* 转换成 XMVECTOR 再做向量计算. 。
  4. 用存储方法来将 XMVECTOR 转换成 XMFLOAT*

XMMATRIX(XNA数学库的矩阵)

猜你喜欢

转载自www.cnblogs.com/KillerAery/p/9097733.html