Share via


從 XNA 數學程式庫移轉程式碼

本概觀描述使用 XNA Math 程式庫將現有程式碼移轉至 DirectXMath 程式庫所需的變更。

標頭變更

DirectXMath 程式庫使用一組新的標頭。

xnamath.h 標頭取代為 DirectXMath.h ,並針對GPU 封裝類型新增 DirectXPackedVector.h

中的 DirectX SDK 衝突範例中的 xnacollision.h 周框類型現在是 中 DirectXCollision.h DirectXMath 程式庫的一部分。 這些已修改為使用 C++ 類別,而不是 C 樣式 API。

常數變更

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 Math 只使用全域命名空間。 與 XNA Math 通用的 DirectXMath 類型位於 DirectXDirectX::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;
};

部分載入

對於載入少於 4 個 XMVECTOR 元素的各種函式,XNA Math 程式庫會將其他元素保留未定義。 DirectXMath 一律會以 0 填入這些額外的元素。

移除 Xbox 360 特定類型

DirectXMath 中不提供下列 XNA 數學程式庫類型、函式和常數。

  • HENDN3、XEND3、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已被取代。 請改用 XMVECTORI32XMVECTORU32

下列函式和類型已過時,因為它們僅限 Xbox 360:XMLoadDecN4、XMStoreDecN4、XMDECN4、XMLoadDec4、XMStoreDec4、XMDEC4、XMLoadXDec4、XMStoreXDec4、XMXDEC4。

ARM-NEON 內建函式

使用此程式碼宣告向量常數將會針對 SSE 和 NO-INTRINSICS 的 XNA Math 進行編譯,但使用 ARM-NEON 的 DirectXMath 將會失敗。

XMVECTOR v = { 1.f, 2.f, 3.f, 4.f }

一般而言,我們不建議使用這個 方法初始化 XMVECTOR。 不過,如果您想要向量常數, XMVECTORF32 類別支援這種初始化樣式,並自動傳回 XMVECTOR 類型,因此您可以在大部分相同的內容中使用 XMVECTORF32XMVECTORF32類別的任何寫入作業都需要明確參考 .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 XMVector2InBoundsXM_CRMASK_CR6BOUNDS : 0
XMVector2TransformStreamNC XMVector2TransformStream
XMVector3InBoundsR XMVector3InBoundsXM_CRMASK_CR6BOUNDS : 0
XMVector3TransformStreamNC XMVector3TransformStream
XMVector4InBoundsR XMVector4InBoundsXM_CRMASK_CR6BOUNDS : 0
XMVectorCosHEst XMVectorCosH
XMVectorExpEst XMVectorExp
XMVectorLogEst XMVectorLog
XMVectorPowEst XMVectorPow
XMVectorSinHEst XMVectorSinH
XMVectorTanHEst XMVectorTanH

DirectXMath 程式設計手冊