其他分享
首页 > 其他分享> > DirectX12-常用数学库

DirectX12-常用数学库

作者:互联网

·采用SIMD流指令扩展2(SSE2)指令集

·头文件:

#include<DirectXMath.h>
#include<DirectXPackedVector.h>

1.向量

·核心向量类型:XMVECTOR(局部、全局变量)

typedef _m128 XMVECTOR;		//_m128为特殊的SIMD类型

·对于类中的数据成员,分别使用XMFLOAT2、XMFLOAT3、XMFLOAT4

·运算前,通过加载函数将XMFLOATn类型转换为XMVECTOR类型

·存储函数将XMVECTOR转换为XMFLOATn

·加载函数:

XMVECTOR XM_CALLCNOV XMLoadFloatn( const XMFLOATn* pSource );

·存储函数:

void XM_CALLCONV XMStoreFloatn( XMFLOATn* pDestination, FXMVECTOR V );

·从XMVECTOR实例取得某一向量分量或某一向量分量转换为XMVECTOR类型:

float XM_CALLCONV XMVectorGetX( FXMVECTOR V );		//X,Y,Z,W

XMVECTOR XM_CALLCONV XMVectorSetX( FXMVECTOR V, float x);  //X,Y,Z,W

·XM_CALLCONV:放置在函数名前,根据编译器的版本确定对应的调用约定属性

·构造函数不适用XM_CALLCONV

·为提高效率,XMVECTOR类型的值作为函数的参数直接传送至SSE/SSE2寄存器,而不存于栈内

·传递XMVECTOR的参数规则:
·前三个XMVECTOR参数应为FXMVECTOR
·第四个为GXMVECTOR
·第五、六个为HXMVECTOR
·其余为CXMVECTOR

·32位操作系统上,编译器根据__fastcall调用约定将前三个XMVECTOR参数传递到寄存器中,其余存于栈;而根据__vectorcall调用约定将前六个XMVECTOR参数传递至寄存器,其余存于栈

·建议:前三个XMVECTOR参数用FXMVECTOR类型,其余XMVECTOR参数用CXMVECTOR类型

·在XMVECTOR的参数间掺杂非XMVECTOR参数,统计时对其他类型的参数视若无睹

·传递XMVECTOR参数的规则仅适用于“输入”参数,“输出”的XMVECTOR参数则不会占用SSE/SSE2寄存器

·XMVECTORF32:XMVECTOR的常量实例

·通过XMVECTORU32创建由整形数据构成的XMVECTOR向量

static const XMVECTORU32 vGrabY = {
    0x00000000,0xFFFFFFFF,0X00000000,0X00000000
};

·XMVECTOR类型对加、减、标量乘提供了重载运算符

·弧度和角度间的互相转化

inline float XMConvertToRadians( float fDegrees )
{
    return fDegrees * ( XM_PI / 180.0f );
}
inline float XMConvertToDegrees( float fRadians)
{
    return fRadians * ( 180.0f / XM_PI );
}

·求两数间较大值及较小值

template< class T > inline T XMMin( T a, T b ) { return ( a < b ) ? a : b;}
template< class T > inline T XMMax( T a, T b ) { return ( a > b ) ? a : b;} 

·Setter函数

//返回零向量
XMVECTOR XM_CALLCONV XMVectorZero();
//返回向量(1,1,1,1)
XMVECTOR XM_CALLCONV XMVectorZeroSplatOne();
//返回向量(x,y,z,w)
XMVECTOR XM_CALLCONV XMVECTORSet( float x, float y, float z, float w );
//返回向量(value,value,value,value)
XMVECTOR XM_CALLCONV XMVectorReplicate( float Value );
//返回向量(vx,vx,vx,vx)
XMVECTOR XM_CALLCONV XMVectorSplatX(FXMVECTOR)  //X,Y,Z

·向量函数

//返回|v|
XMVECTOR XM_CALLCONV XMVector3Length( FXMVECTOR v );
//返回||V||²
XMVECTOR XM_CALLCONV XMVector3LengthSq( FXMVECTOR v );
//返回V1 * V2
XMVECTOR XM_CALLCONV XMVector3Dot( FXMVECTOR V1, FXMVECTOR V2 );
//返回V1 x V2
XMVECTOR XM_CALLCONV XMVectorCross( FXMVECTOR V1, FXMVECTOR V2 );
//返回v // ||v||
XMVECTOR XM_CALLCONV XMVector3Normalize( FXMVECTOR V );
//返回一个正交于v的向量
XMVECTOR XM_CALLCONV XMVector3Orthogonal( FXMVECTOR V );
//返回v1、v2的夹角
XMVECTOR XM_CALLCONV XMVector3AngleBetweenVectors( FXMVECTOR V1, FXVECTOR V2);
//返回v1 == v2?
bool XM_CALLCONV XMVector3Equal( FXMVECTOR V1, FXMVECTOR V2 );
//返回v1 != v2 ?
bool XM_CALLCONV XMVECTOR3NotEqual( FXMVECTOR V1, FXMVECTOR V2);

2.矩阵

3.变换

标签:常用,XM,float,数学,DirectX12,CALLCONV,FXMVECTOR,XMVECTOR,XMMATRIX
来源: https://www.cnblogs.com/chenglixue/p/16367540.html