Bagikan melalui


Migrasi Kode dari Pustaka Matematika XNA

Gambaran umum ini menjelaskan perubahan yang diperlukan untuk memigrasikan kode yang ada menggunakan pustaka Matematika XNA ke pustaka DirectXMath.

Perubahan Header

Pustaka DirectXMath menggunakan sekumpulan header baru.

xnamath.h Ganti header dengan DirectXMath.h, dan tambahkan DirectXPackedVector.h untuk jenis paket GPU.

Jenis pembatas dari sampel Tabrakan DirectX SDK sekarang xnacollision.h menjadi bagian dari pustaka DirectXMath di DirectXCollision.h. Ini telah dimodifikasi untuk menggunakan kelas C++ daripada API gaya C.

Perubahan Konstanta

XNAMATH_VERSION (200, 201, 202, 203, 204, dan sebagainya) telah diganti dengan DIRECXTMATH_VERSION (300, 301, 302, 303, dan sebagainya).

Catatan

DirectXMath 3.00 dan 3.02 dikirim dengan versi awal Windows SDK. DirectXMath 3.03 berada dalam versi akhir SDK Windows 8.

Namaspace

Pustaka DirectXMath menggunakan namespace C++ untuk mengatur jenis. Matematika XNA hanya menggunakan namespace global. Jenis DirectXMath yang sama dengan Matematika XNA ada di namespace DirectX atau DirectX::P ackedVector .

Dalam file sumber C++, solusi sederhananya adalah menambahkan using pernyataan.

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

using namespace DirectX; 
using namespace DirectX::PackedVector;

Untuk header, tidak dianggap sebagai praktik terbaik untuk menambahkan menggunakan pernyataan. Sebagai gantinya, tambahkan namespace yang sepenuhnya memenuhi syarat.

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

Beban Parsial

Untuk berbagai fungsi yang memuat kurang dari 4 elemen XMVECTOR, pustaka Matematika XNA membiarkan elemen tambahan tidak terdefinisi. DirectXMath akan selalu mengisi elemen tambahan ini dengan 0.

Penghapusan Tipe Spesifik Xbox 360

Jenis, fungsi, dan konstanta pustaka Matematika XNA berikut ini tidak tersedia di 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 tidak digunakan lagi. Gunakan XMVECTORI32 atau XMVECTORU32 sebagai gantinya.

Fungsi dan jenis berikut tidak digunakan lagi karena hanya Xbox 360: XMLoadDecN4, XMStoreDecN4, XMDECN4, XMLoadDec4, XMStoreDec4, XMDEC4, XMLoadXDec4, XMStoreXDec4, XMXDEC4.

Intrinsik ARM-NEON

Mendeklarasikan konstanta vektor dengan kode ini akan dikompilasi untuk Matematika XNA untuk SSE dan NO-INTRINSICS, tetapi akan gagal untuk DirectXMath menggunakan ARM-NEON.

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

Secara umum, kami tidak merekomendasikan metode inisialisasi XMVECTOR ini. Namun, jika Anda menginginkan konstanta vektor, kelas XMVECTORF32 mendukung gaya inisialisasi ini dan mengembalikan jenis XMVECTOR secara otomatis sehingga Anda dapat menggunakan XMVECTORF32 dalam sebagian besar konteks yang sama. Setiap operasi tulis ke kelas XMVECTORF32 memerlukan referensi eksplisit anggota .v XMVECTOR .

Permute

Pustaka Matematika XNA memiliki formulir berikut untuk permutus vektor umum:

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

Untuk DirectXMath, XMVectorPermuteControl telah dihilangkan dan XM_PERMUTE_0X .. XM_PERMUTE_1Z konstanta telah ditentukan ulang menjadi indeks 0-7 sederhana. Berikut adalah tanda tangan baru untuk XMVectorPermute:

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

Alih-alih kata kontrol, fungsi ini secara langsung mengambil 4 indeks sebagai parameter, yang juga membuatnya dianalogikan dengan fungsi XMVectorSwizzle menggunakan XM_SWIZZLE_X baru . XM_SWIZZLE_W konstanta yang didefinisikan sebagai indeks 0-3 sederhana.

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

Catatan

Untuk nilai konstanta, ada cara yang jauh lebih efisien untuk menerapkan permute. Alih-alih menggunakan bentuk fungsi XMVectorPermute, gunakan formulir templat :

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

Formulir Templat

Secara umum, menggunakan formulir templat melalui bentuk fungsi dari fungsi berikut jauh lebih efisien dan memungkinkan pustaka untuk melakukan pengoptimalan khusus platform melalui spesialisasi templat.

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>

Fungsi yang Dihilangkan

Fungsi Yang Dihilangkan Pengganti
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

Panduan Pemrograman DirectXMath