Share via


XNA 수학 라이브러리에서 코드 마이그레이션

이 개요에서는 XNA 수학 라이브러리를 사용하여 기존 코드를 DirectXMath 라이브러리로 마이그레이션하는 데 필요한 변경 내용을 설명합니다.

헤더 변경 내용

DirectXMath 라이브러리는 새 헤더 집합을 사용합니다.

헤더를 xnamath.hDirectXMath.h바꾸고 GPU 압축 형식에 대해 를 추가 DirectXPackedVector.h 합니다.

의 DirectX SDK 충돌 샘플 xnacollision.h 의 경계 형식은 이제 의 DirectXMath 라이브러리에 DirectXCollision.h포함됩니다. 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(), XMStoreUDHen3()
  • 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 를 사용합니다.

XMLoadDecN4, XMStoreDecN4, XMDECN4, XMLoadDec4, XMStoreDec4, XMDEC4, XMLoadXDec4, XMStoreXDec4, XMXDEC4, XMXDEC4 함수 및 형식은 Xbox 360만 사용되므로 더 이상 사용되지 않습니다.

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 수학 라이브러리에는 일반 벡터 음소거에 대해 다음과 같은 형식이 있습니다.

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

DirectXMath 프로그래밍 가이드