반응형

DirectX 10 까지는 D3DX library의 3D Math쪽을 사용하였지만 DirectX 11부터는 XNAMath library가 제공된다.


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를 지원하는지 체크 가능.

Setter 함수


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);

Vector 함수


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);

등등 많은 함수 제공한다.

XMMATRIX


로컬이나 전역 변수로는 XMMATRIX를 추천한다.

Class의 멤버 변수로는 XMFLOAT4X4를 추천한다. -> XMVECTOR와 마찬가지로 구조체 패딩 정렬등의 문제.

대표적인 함수

XMMATRIX  XMMatrixIdentity();
BOOL          XMMatrixIsIdentity(CXMMATRIX M);
XMMATRIX  XMMatrixMultiply(CXMMATRIX M1, CXMMATRIX M2);
XMMATRIX  XMMatrixTranspose(CXMMATRIX M);
XMVECTOR  XMMatrixDeterminent(CXMMATRIX M);
XMMATRIX  XMMatrixInverse(XMVECTOR* determinent, CXMMATRIX M);

파라미터

typedef const XMMATRIX CXMMATRIX;

TRANSFORMATION


XMMATRIX  XMMatrixScaling(FLOAT ScaleX, FLOAT ScaleY, FLOAT ScaleZ);
XMMATRIX  XMMatrixScalingFromVector(FXMVECTOR Scale);
XMMATRIX  XMMatrixRotationX(FLOAT Angle);
XMMATRIX  XMMatrixRotationY(FLOAT Angle);
XMMATRIX  XMMatrixRotationZ(FLOAT Angle);
XMMATRIX  XMMatrixRotationAxis(FXMVECTOR Axis, FLOAT Angle);
XMMATRIX  XMMatrixTranslation(FLOAT OffsetX, FLOAT OffsetY, FLOAT OffsetZ);
XMMATRIX  XMMatrixTranslationFromVector(FXMVECTOR Offset);

XMVECTOR XMVector3Transform(FXMVECTOR V, CXMMATRIX M);
XMVECTOR XMVector3TransformCoord(FXMVECTOR V, CXMMATRIX M);
XMVECTOR XMVector3TransformNormal(FXMVECTOR V, CXMMATRIX M);

더 자세한건 도큐먼트를 참고하면 될 것 같다.

앞으로 사용해보면서 중요한 내용이 있거나 팁이 있으면 올리도록 하겠다.





반응형
Posted by msparkms
,