从 XNA 数学库迁移代码
本概述介绍了使用 XNA 数学库将现有代码迁移到 DirectXMath 库所需的更改。
标头更改
DirectXMath 库使用一组新的标头。
将 xnamath.h
标头替换为 DirectXMath.h
,并为 GPU 打包 类型添加 DirectXPackedVector.h
。
xnacollision.h
DirectX SDK 冲突示例中的边界类型现在是 DirectXCollision.h
DirectXMath 库的一部分。 这些已修改为使用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 数学仅使用全局命名空间。 与 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 数学库将其他元素保留为未定义。 DirectXMath 将始终用 0 填充这些附加元素。
删除 Xbox 360 特定类型
以下 XNA 数学库类型、函数和常量在 DirectXMath 中不可用。
- HENDN3、XMHEND3、XMUHENDN3、XMUHEND3、XMDHENN3、XMDHEN3、XMUDHENN3、XMUDHEN3
- XMLoadHendN3()、XMLoadHend3()、XMLoaduHendN3()、XMLoaduHend3()、XMLoaddHenn3()、XMLoadDHenn3()、XMLoadUDHenN3()、XMLoadUDHenn3()
- XMStoreHendN3()、XMStoreHend3()、XMStoreuHendN3()、XMStoreuHend3()、XMStoredHenN3()、XMStoreDHenN3()、XMStoreUDHenN3()、XMStoreUDHenN3()
- 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()、XMLoadIcoN4()、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、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 成员。
取代
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);
注意
对于常量值,有一种更有效的方法来实现排列。 使用 模板 表单,而不是使用 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 |