从 XNA 数学库迁移代码

本概述介绍使用 XNA 数学库将现有代码迁移到 DirectXMath 库所需的更改。

标头更改

DirectXMath 库使用一组新的标头。

xnamath.h 标头替换为 DirectXMath.h,并为 GPU 打包类型添加 DirectXPackedVector.h

中的 xnacollision.h DirectX SDK 冲突示例中的边界类型现在是 中的 DirectXMath 库的一 DirectXCollision.h部分。 这些 API 已修改为使用 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 类型位于 DirectXDirectX::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 数学库未定义其他元素。 DirectXMath 始终使用 0 填充这些附加元素。

删除 Xbox 360 特定类型

以下 XNA 数学库类型、函数和常量在 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已弃用。 请改用 XMVECTORI32XMVECTORU32

以下函数和类型已弃用,因为它们仅是 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 函数。 XM_SWIZZLE_W定义为简单 0-3 个索引的常量。

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

注意

对于常量值,有一种更有效的方法来实现 permute。 不要使用 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 XMVector2InBoundsXM_CRMASK_CR6BOUNDS : 0
XMVector2TransformStreamNC XMVector2TransformStream
XMVector3InBoundsR XMVector3InBoundsXM_CRMASK_CR6BOUNDS : 0
XMVector3TransformStreamNC XMVector3TransformStream
XMVector4InBoundsR XMVector4InBoundsXM_CRMASK_CR6BOUNDS : 0
XMVectorCosHEst XMVectorCosH
XMVectorExpEst XMVectorExp
XMVectorLogEst XMVectorLog
XMVectorPowEst XMVectorPow
XMVectorSinHEst XMVectorSinH
XMVectorTanHEst XMVectorTanH

DirectXMath 编程指南