從 XNA 數學連結庫移轉程式代碼
本概觀描述使用 XNA Math 連結庫將現有程式代碼移轉至 DirectXMath 連結庫所需的變更。
標頭變更
DirectXMath 連結庫會使用一組新的標頭。
將 xnamath.h
標頭取代為 DirectXMath.h
,併為封裝 類型的 GPU 新增 DirectXPackedVector.h
。
xnacollision.h
中 DirectX SDK 衝突範例中的界限類型現在是 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 類型位於 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 Math 連結庫會將其他元素保留為未定義。 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。
下列函式和類型僅取代為 Xbox 360:XMLoadDecN4、XMStoreDecN4、XMDECN4、XMLoadDec4、XMStoreDec4、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 類型,因此您可以在大部分相同的內容中使用 XMVECTORF32。 XMVECTORF32 類別的任何寫入作業都需要明確參考 .v XMVECTOR 成員。
取代
XNA Math 連結庫具有下列格式的一般向量排列:
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 |