Condividi tramite


Migrazione del codice dalla libreria matematica XNA

Questa panoramica descrive le modifiche necessarie per eseguire la migrazione del codice esistente usando la libreria matematica XNA alla libreria DirectXMath.

Modifiche all'intestazione

La libreria DirectXMath usa un nuovo set di intestazioni.

Sostituire l'intestazione xnamath.h con DirectXMath.he aggiungere DirectXPackedVector.h per i tipi di compressi GPU.

I tipi di delimitazione dell'esempio di collisione di DirectX SDK in xnacollision.h fanno ora parte della libreria DirectXMath in DirectXCollision.h. Queste sono state modificate per usare classi C++ anziché un'API di tipo C.

Modifiche costanti

XNAMATH_VERSION (200, 201, 202, 203, 204 e così via) è stato sostituito con DIRECXTMATH_VERSION (300, 301, 302, 303 e così via).

Nota

DirectXMath 3.00 e 3.02 fornito con versioni preliminari di Windows SDK. DirectXMath 3.03 è nella versione finale di Windows 8 SDK.

Spazi dei nomi

La libreria DirectXMath usa spazi dei nomi C++ per organizzare i tipi. XNA Math usava solo lo spazio dei nomi globale. I tipi DirectXMath in comune con XNA Math si trovano nello spazio dei nomi DirectXo DirectX::P ackedVector.

Nei file di origine C++ una soluzione semplice consiste nell'aggiungere istruzioni using.

#include "DirectXMath.h"
#include "DirectXPackedVector.h"

using namespace DirectX; 
using namespace DirectX::PackedVector;

Per le intestazioni, non è consigliabile aggiungere istruzioni using. Aggiungere invece spazi dei nomi completi.

struct mystruct
{
   DirectX::XMFLOAT3 position;
   DirectX::PackedVector::HALF packedValue;
};

Caricamenti parziali

Per varie funzioni che caricano meno di 4 elementi di un XMVECTOR, la libreria matematica XNA ha lasciato gli elementi aggiuntivi non definiti. DirectXMath riempie sempre questi elementi aggiuntivi con 0.

Rimozione di tipi specifici di Xbox 360

I tipi, le funzioni e le costanti della libreria matematica XNA seguenti non sono disponibili in DirectXMath.

  • 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 è deprecato. Usare invece XMVECTORI32 o XMVECTORU32.

Le funzioni e i tipi seguenti sono deprecati perché sono solo Xbox 360: XMLoadDecN4, XMStoreDecN4, XMDECN4, XMLoadDec4, XMStoreDec4, XMDEC4, XMLoadXDec4, XMStoreXDec4, XMXDEC4.

ARM-NEON intrinseci

La dichiarazione di una costante vettoriale con questo codice verrà compilata per XNA Math per SSE e NO-INTRINSICS, ma avrà esito negativo per DirectXMath usando ARM-NEON.

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

In generale, non è consigliabile questo metodo di inizializzazione di un XMVECTOR. Tuttavia, se si desidera una costante vettoriale, la classe XMVECTORF32 supporta questo stile di inizializzazione e restituisce automaticamente il tipo di XMVECTOR in modo da poter usare XMVECTORF32 nella maggior parte degli stessi contesti. Per qualsiasi operazione di scrittura in una classe XMVECTORF32 è necessario fare riferimento in modo esplicito al membro XMVECTOR XMVECTOR.

Permutare

La libreria matematica XNA ha il formato seguente per la permuta del vettore generale:

XMVECTOR XMVectorPermuteControl(UINT ElementIndex0, UINT ElementIndex1, UINT ElementIndex2, UINT ElementIndex3);
XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, FXMVECTOR Control);

Per DirectXMath, XMVectorPermuteControl è stato eliminato e il XM_PERMUTE_0X .. XM_PERMUTE_1Z costanti sono state ridefinite in modo da essere semplici indici da 0 a 7. Ecco la nuova firma per XMVectorPermute:

XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW);

Invece di una parola di controllo, questa funzione accetta direttamente i 4 indici come parametri, che lo rende analogo anche alla funzione XMVectorSwizzle usando il nuovo XM_SWIZZLE_X .. XM_SWIZZLE_W costanti definite come semplici indici da 0 a 3.

XMVECTOR XMVectorSwizzle(FXMVECTOR V, uint32_t E0, uint32_t E1, uint32_t E2, uint32_t E3);

Nota

Per i valori costanti, esiste un modo molto più efficiente per implementare la permuta. Anziché usare il formato di funzione di XMVectorPermute, usare il modulo modello di:

template<uint32_t PermuteX, uint32_t PermuteY, uint32_t PermuteZ, uint32_t PermuteW>
    XMVECTOR XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2)</code></pre></td>

Moduli modello

In generale, l'uso di un modulo modello su una forma di funzione delle funzioni seguenti è molto più efficiente e consente alla libreria di eseguire ottimizzazioni specifiche della piattaforma tramite la specializzazione del modello.

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>

Funzioni eliminate

Funzione eliminata Rimpiazzo
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

guida alla programmazione DirectXMath