XNA 数学ライブラリからのコード移行
この概要では、XNA Math ライブラリを使用して既存のコードを DirectXMath ライブラリに移行するために必要な変更について説明します。
ヘッダーの変更
DirectXMath ライブラリでは、新しいヘッダー のセットが使用されます。
ヘッダーを にxnamath.h
DirectXMath.h
置き換え、GPU パックの種類に対して を追加DirectXPackedVector.h
します。
の DirectX SDK Collision サンプル 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 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 固有の種類の削除
次の XNA Math ライブラリの種類、関数、および定数は、DirectXMath では使用できません。
- HENDN3、XMHEND3、XMUHENDN3、XMUHEND3、XMDHENN3、XMDHEN3、XMUDHENN3、XMUDHEN3
- XMLoadHenDN3()、XMLoadHenD3()、XMLoadUHenDN3()、XMLoadUHenD3()、XMLoadDHenN3()、XMLoadUDHenN3()、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、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 メンバーを明示的に参照する必要があります。
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 関数に似ています。 単純な 0 から 3 のインデックスとして定義された定数をXM_SWIZZLE_Wします。
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>
削除された関数
削除された関数 | Replacement |
---|---|
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 |