XNA 수학 라이브러리에서 코드 마이그레이션
이 개요에서는 XNA 수학 라이브러리를 사용하여 기존 코드를 DirectXMath 라이브러리로 마이그레이션하는 데 필요한 변경 내용을 설명합니다.
헤더 변경 내용
DirectXMath 라이브러리는 새 헤더 집합을 사용합니다.
xnamath.h
헤더를 DirectXMath.h
바꾸고 GPU 압축 형식에 대한 DirectXPackedVector.h
추가합니다.
xnacollision.h
DirectX SDK 충돌 샘플의 경계 형식은 이제 DirectXCollision.h
DirectXMath 라이브러리의 일부입니다. C 스타일 API 대신 C++ 클래스를 사용하도록 수정되었습니다.
상수 변경
XNAMATH_VERSION(200, 201, 202, 203, 204 등)은 DIRECXTMATH_VERSION(300, 301, 302, 303 등)으로 대체되었습니다.
메모
DirectXMath 3.00 및 3.02는 Windows SDK의 예비 버전과 함께 제공됩니다. DirectXMath 3.03은 Windows 8 SDK의 최종 버전입니다.
네임스페이스
DirectXMath 라이브러리는 C++ 네임스페이스를 사용하여 형식을 구성합니다. XNA 수학은 전역 네임스페이스만 사용했습니다. XNA 수학과 공통된 DirectXMath 형식은 DirectX 또는 DirectX::P ackedVector 네임스페이스에 있습니다.
C++ 소스 파일에서 간단한 해결 방법은 using
문을 추가하는 것입니다.
#include "DirectXMath.h"
#include "DirectXPackedVector.h"
using namespace DirectX;
using namespace DirectX::PackedVector;
헤더의 경우 using 문을 추가하는 것이 모범 사례로 간주되지 않습니다. 대신 정규화된 네임스페이스를 추가합니다.
struct mystruct
{
DirectX::XMFLOAT3 position;
DirectX::PackedVector::HALF packedValue;
};
부분 로드
XMVECTOR의 4개 미만의 요소를 로드하는 다양한 함수의 경우 XNA 수학 라이브러리는 추가 요소를 정의되지 않은 상태로 했습니다. DirectXMath는 항상 이러한 추가 요소를 0으로 채웁니다.
Xbox 360 특정 형식 제거
DirectXMath에서는 다음 XNA 수학 라이브러리 형식, 함수 및 상수는 사용할 수 없습니다.
- HENDN3, XMHEND3, XMUHENDN3, XMUHEND3, XMDHENN3, XMDHEN3, XMUDHENN3, XMUDHEN3
- XMLoadHenDN3(), XMLoadHenD3((), XMLoadUHenDN3(),XMLoadUHenD3(), XMLoadDHenn3(), XMLoadDHen3(), XMLoadUDHenN3(), XMLoadUDHen3()
- XMStoreHenDN3(), XMStoreHenD3(), XMStoreUHenDN3(), XMStoreUHenD3(), XMStoreDHenN3(), XMStoreDHen3(), XMStoreUDHenN3(), XMStoreUDHenN3()
- g_XMMaskHenD3, g_XMMaskDHen3, g_XMAddUHenD3, g_XMAddHenD3, g_XMAddDHen, g_XMMulHenD3, g_XMMulDHen3, g_XMXorHenD3, g_XMXorDHen3
- XMXICON4, XMXICO4, XMICON4, XMICO4, XMUICON4, XMUICO4
- XMLoadXIcoN4(), XMLoadXIco4(), XMLoadIcoN4(), XMLoadIco4(), XMLoadUIcoN4(), XMLoadUIco4()
- XMStoreXIcoN4(), XMStoreXIco4() ,XMStoreIcoN4(), XMStoreIco4(), XMStoreUIcoN4(), XMStoreUIco4()
- g_XMMaskIco4, g_XMXorXIco4, g_XMXorIco4, g_XMAddXIco4, g_XMAddUIco4, g_XMAddIco4, g_XMMulIco4
__vector4i 더 이상 사용되지 않습니다. 대신 XMVECTORI32 또는 XMVECTORU32 사용합니다.
The following functions and types are deprecated as they are Xbox 360 only: XMLoadDecN4, XMStoreDecN4, XMDECN4, XMLoadDec4, XMStoreDec4, XMDEC4, XMLoadXDec4, XMStoreXDec4, XMXDEC4.
ARM-NEON 내장 함수
이 코드를 사용하여 벡터 상수 선언은 SSE 및 NO-INTRINSICS용 XNA 수학용으로 컴파일되지만 ARM-NEON을 사용하는 DirectXMath에는 실패합니다.
XMVECTOR v = { 1.f, 2.f, 3.f, 4.f }
일반적으로 XMVECTOR초기화하는 방법은 권장하지 않습니다. 그러나 벡터 상수를 원하는 경우 XMVECTORF32 클래스는 이 초기화 스타일을 지원하고 XMVECTOR 형식을 자동으로 반환하므로 대부분의 동일한 컨텍스트에서 XMVECTORF32 사용할 수 있습니다. XMVECTORF32 클래스에 대한 쓰기 작업을 수행하려면 .v XMVECTOR 멤버를 명시적으로 참조해야 합니다.
Permute
XNA 수학 라이브러리는 일반 벡터 permute에 대해 다음과 같은 형식을 사용했습니다.
XMVECTOR XMVectorPermuteControl(UINT ElementIndex0, UINT ElementIndex1, UINT ElementIndex2, UINT ElementIndex3);
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR Control);
DirectXMath의 경우 XMVectorPermuteControl 제거되고 XM_PERMUTE_0X. XM_PERMUTE_1Z 상수는 단순 0-7 인덱스로 다시 정의되었습니다. 다음은 XMVectorPermute대한 새 서명입니다.
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW);
이 함수는 컨트롤 단어 대신 4개의 인덱스를 매개 변수로 직접 사용하므로 새 XM_SWIZZLE_X 사용하여 XMVectorSwizzle 함수와 유사합니다. XM_SWIZZLE_W 단순 0-3 인덱스로 정의된 상수입니다.
XMVECTOR XMVectorSwizzle(FXMVECTOR V, uint32_t E0, uint32_t E1, uint32_t E2, uint32_t E3);
메모
상수 값의 경우 훨씬 더 효율적인 방법으로 퍼뮤트를 구현할 수 있습니다. XMVectorPermute함수 형식을 사용하는 대신 템플릿 양식을 사용합니다.
template<uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW>
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2)</code></pre></td>
서식 파일 양식
일반적으로 다음 함수의 함수 형식에 템플릿 양식을 사용하는 것이 훨씬 더 효율적이며 라이브러리에서 템플릿 특수화를 통해 플랫폼별 최적화를 수행할 수 있습니다.
template<uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW>
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2)
template<uint32_t SwizzleX, uint32_t SwizzleY, uint32_t SwizzleZ, uint32_t SwizzleW>
XMVECTOR XMVectorSwizzle(FXMVECTOR V)
template<uint32_t Elements>
XMVECTOR XMVectorShiftLeft(FXMVECTOR V1, FXMVECTOR V2)
template<uint32_t Elements>
XMVECTOR XMVectorRotateLeft(FXMVECTOR V)
template<uint32_t Elements>
XMVECTOR XMVectorRotateRight(FXMVECTOR V)
template<uint32_t VSLeftRotateElements, uint32_t Select0, uint32_t Select1, uint32_t Select2, uint32_t Select3>
XMVECTOR XMVectorInsert(FXMVECTOR VD, FXMVECTOR VS)</code></pre></td>
제거된 함수
제거된 함수 | 교체 |
---|---|
XMStoreFloat3x3NC | XMStoreFloat3x3 |
XMStoreFloat4NC | XMStoreFloat4 |
XMStoreFloat4x3NC | XMStoreFloat4x3 |
XMStoreFloat4x4NC | XMStoreFloat4x4 |
XMStoreInt4NC | XMStoreInt4 |
XMVector2InBoundsR | XMVector2InBounds? XM_CRMASK_CR6BOUNDS : 0 |
XMVector2TransformStreamNC | XMVector2TransformStream |
XMVector3InBoundsR | XMVector3InBounds? XM_CRMASK_CR6BOUNDS : 0 |
XMVector3TransformStreamNC | XMVector3TransformStream |
XMVector4InBoundsR | XMVector4InBounds? XM_CRMASK_CR6BOUNDS : 0 |
XMVectorCosHEst | XMVectorCosH |
XMVectorExpEst | XMVectorExp |
XMVectorLogEst | XMVectorLog |
XMVectorPowEst | XMVectorPow |
XMVectorSinHEst | XMVectorSinH |
XMVectorTanHEst | XMVectorTanH |