XNAMath libarary는 SSE2 명령어 세트로 만들어진 라이브러리이다.
기본적으로 속도도 빠르고 병렬처리가 가능하므로 잘만 이용하면 알고리즘 최적화 등에도 사용할 수 있다.
어떤식을 디자인되었는지 궁금하면 Designing Fast Cross-Platform SIMD Vector Libraries를 참고하라.
#include <xnamath.h> 만 넣어주면 된다.
따로 라이브러리 추가도 필요없다. -> 헤더에 인라인 함수로 모두 구현되어 있다.
이전 함수는 접두사로 D3DX가 붙었는데 XNAMath는 XM이 붙는다.
대부분 함수 이름들이 비슷하니 금방 적응 할 수 있을 것이다.
XMVECTOR
로컬이나 전역 변수로는 XMVECTOR를 추천한다.
Class의 멤버 변수로는 XMFLOAT2, XMFLOAT3, XMFLOAT4를 추천한다.
위의 타입은 SIMD의 장점을 취하지 않는다. -> 그냥 일반 구조체
SIMD를 사용하기 위해서는 XMVECTOR 타입을 이용해야 한다.
loading 함수는 XMFLOAT*를 XMVECTOR로 변환하는데 사용된다.
storage 함수는 XMVECTOR를 XMFLOAT*로 변환하는데 사용된다.
loading 함수
XMVECTOR XMLoadFloat2(CONST XMFLOAT2* source);
XMVECTOR XMLoadFloat3(CONST XMFLOAT3* source);
XMVECTOR XMLoadFloat4(CONST XMFLOAT4* source);
XMVECTOR XMLoadInt3(CONST UINT* source);
XMVECTOR XMLoadColor(CONST XMCOLOR* source);
XMVECTOR XMLoadByte4(CONST XMBYTE4* source);
storage 함수
VOID XMStoreFloat2(XMFLOAT2* dest, FXMVECTOR V);
VOID XMStoreFloat3(XMFLOAT3* dest, FXMVECTOR V);
VOID XMStoreFloat4(XMFLOAT4* dest, FXMVECTOR V);
VOID XMStoreInt3(UINT* dest, FXMVECTOR V);
VOID XMStoreColor(XMCOLOR* dest, FXMVECTOR V);
VOID XMStoreByte4(XMBYTE4* dest, FXMVECTOR V);
get, set 함수
FLOAT XMVectorGetX(FMXVECTOR V);
FLOAT XMVectorGetY(FMXVECTOR V);
FLOAT XMVectorGetZ(FMXVECTOR V);
FLOAT XMVectorGetW(FMXVECTOR V);
XMVECTOR XMVectorSetX(FXMVECTOR V, FLOAT x);
XMVECTOR XMVectorSetY(FXMVECTOR V, FLOAT y);
XMVECTOR XMVectorSetZ(FXMVECTOR V, FLOAT z);
XMVECTOR XMVectorSetW(FXMVECTOR V, FLOAT w);
파라미터
// 32bit
typedef const XMVECTOR FXMVECTOR;
typedef const XMVECTOR& CXMVECTOR;
// 64bit
typedef const XMVECTOR& FXMVECTOR;
typedef const XMVECTOR& CXMVECTOR;
typedef _DECLSPEC_ALIGN_16_ struct XMVECTORF32 {
union {
float f[4];
XMVECTOR v;
};
};
XMVECTOR, __m128i, __m128d 오퍼레이터가 구현되어 있음.
XMVECTORU32도 있음.
기본적으로 필요한 것들은 다 되어 있다.
MX_PI
XM_2PI
XM_1DIVPI
XM_1DIV2PI
XM_PIDIV2
XM_PIDIV4
XMFINLINE FLOAT XMConvertToRadians(FLOAT degree);
XMFINLINE FLOAT XMConvertToDegrees(FLOAT radian);
XMMin(a, b)
XMMax(a, b)
XMVerifyCPUSupport() 함수로 SSE2를 지원하는지 체크 가능.
XMVECTOR XMVectorZero();
XMVECTOR XMVectorSplatOne();
XMVECTOR XMVectorSet(FLOAT x, FLOAT y, FLOAT z, FLOAT w);
XMVECTOR XMVectorReplicate(FLOAT s);
XMVECTOR XMVectorSplatX(FXMVECTOR V);
XMVECTOR XMVectorSplatY(FXMVECTOR V);
XMVECTOR XMVectorSplatZ(FXMVECTOR V);
XMVECTOR XMVectorAdd(FXMVECTOR V1, FXMVECTOR V2);
XMVECTOR XMVectorSubtract(FXMVECTOR V1, FXMVECTOR V2);
XMVECTOR XMVectorMultiply(FXMVECTOR V1, FXMVECTOR V2);
XMVECTOR XMVector3Length(FXMVECTOR V);
XMVECTOR XMVector3LengthSq(FXMVECTOR V);
XMVECTOR XMVector3Dot(FXMVECTOR V1, FXMVECTOR V2);
XMVECTOR XMVector3Cross(FXMVECTOR V1, FXMVECTOR V2);
XMVECTOR XMVector3Normalize(FXMVECTOR V);
XMVECTOR XMVector3Orthogonal(FXMVECTOR V);
XMVECTOR XMVector3ANgleBetweenVectors(FXMVECTOR V1, FXMVECTOR V2);
VOID XMVector3ComponentsFromNormal(XMVECTOR* parallel, XMVECTOR* perpendicular, FXMVECTOR V, FXMVECTOR normal);
VOID XMVector3NotEqual(FXMVECTOR V1, FXVECTOR V2);
XMVECTOR XMVectorAbs(FXVECTOR V);
XMVECTOR XMVectorCos(FXVECTOR V);
XMVECTOR XMVectorLog(FXVECTOR V);
XMVECTOR XMVectorExp(FXVECTOR V);
XMVECTOR XMVectorPos(FXVECTOR V, FXVECTOR P);
XMVECTOR XMVectorSqrt(FXVECTOR V);
XMVECTOR XMVectorSwizzle(FXMVECTOR V, UINT E0, UINT E1, UINT E2, UINT E3);
XMVECTOR XMVectorMax(FXVECTOR V1, FXVECTOR V2);
XMVECTOR XMVectorMin(FXVECTOR V1, FXVECTOR V2);
XMFINLINE BOOL XMVector3NearEqual(FXMVECTOR U, FXMVECTOR V, FXMVECTOR epsilon);
등등 많은 함수 제공한다.
더 자세한건 도큐먼트를 참고하면 될 것 같다.
앞으로 사용해보면서 중요한 내용이 있거나 팁이 있으면 올리도록 하겠다.