Миграция кода из библиотеки математических вычислений XNA
В этом обзоре описываются изменения, необходимые для переноса существующего кода с помощью библиотеки XNA Math в библиотеку DirectXMath.
Изменения заголовков
Библиотека DirectXMath использует новый набор заголовков.
Замените заголовок xnamath.h
DirectXMath.h
на и добавьте DirectXPackedVector.h
для упакованных типов GPU .
Ограничивающие типы из примера конфликтов пакета SDK DirectX в 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 входит в окончательную версию пакета SDK для Windows 8.
Пространства имен
Библиотека DirectXMath использует пространства имен C++ для упорядочения типов. Математика XNA использует только глобальное пространство имен. Типы DirectXMath, общие с математикой XNA, находятся в пространстве имен 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;
};
Частичные загрузки
Для различных функций, которые загружают менее 4 элементов XMVECTOR, библиотека математики XNA оставила дополнительные элементы неопределенными. DirectXMath всегда заполняет эти дополнительные элементы 0.
Удаление определенных типов Xbox 360
Следующие типы, функции и константы библиотеки XNA Math недоступны в DirectXMath.
- HENDN3, XMHEND3, XMUHENDN3, XMUHEND3, XMDHENN3, XMDHEN3, XMUDHENN3, XMUDHEN3
- XMLoadHenDN3(), XMLoadHenD3(), XMLoadUHenDN3(), XMLoadUHenD3(), XMLoadDHenN3(), XMLoadDHen3(), XMLoadUDHen3(), 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
Объявление константы вектора с помощью этого кода будет компилироваться для XNA Math для SSE и NO-INTRINSICS, но завершится ошибкой для DirectXMath с использованием ARM-NEON.
XMVECTOR v = { 1.f, 2.f, 3.f, 4.f }
Как правило, мы не рекомендуем использовать этот метод инициализации XMVECTOR. Однако если требуется векторная константа, класс XMVECTORF32 поддерживает этот стиль инициализации и автоматически возвращает тип XMVECTOR, что позволяет использовать XMVECTORF32 в большинстве одинаковых контекстов. Любые операции записи в класс XMVECTORF32 требуют явной ссылки на член .v XMVECTOR .
Перемежает
Библиотека математики 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 индекса в качестве параметров, что также делает ее аналогичной функции XMVectorSwizzle с использованием новой XM_SWIZZLE_X .. 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 |