将 CONST D3DMATRIX 转换为 XMMATRIX

Convert CONST D3DMATRIX to XMMATRIX

我是第一次编写包装程序并使用许多不同的头文件,但遇到了问题。 我无法将 D3DMATRIX 转换为 XMMATRIX。查看 https://docs.microsoft.com/en-us/windows/win32/dxmath/pg-xnamath-migration-d3dx 它说 XMMATRIX 如何需要 16 位对齐,但 D3DMATRIX 没有那个要求。

代码:

XMMATRIX WVP1;
---
---
HRESULT m_IDirect3DDevice9Ex::SetTransform(D3DTRANSFORMSTATETYPE State, CONST D3DMATRIX *pMatrix)
{
    WVP1 = WVP1 * *pMatrix;

    ---
    ---
}

在此代码中,每次调用 SetTransform 时,我都想用现有矩阵对通过的矩阵进行乘法运算。

我认为调用函数总是通过 D3DMATRIX,所以我无法更改它。我还需要使用 XMMATRIX 类型。

我已经尝试了一些代码来对此进行排序,但它并没有帮助,例如

const_cast<XMMATRIX*>(&WVP1) = const_cast<XMMATRIX*>(&WVP1) * reinterpret_cast<CONST XMMATRIX*>(pMatrix);

我不知道如何解决这个问题。

谢谢

您应该使用 XMFLOAT4X4,它是 4x4 浮点矩阵的 'memory type',它没有对齐要求。它与D3DMATRIX.

具有相同的结构布局
XMMATRIX m2 = XMLoadFloat4x4(reinterpret_cast<const XMFLOAT4X4*>(pMatrix));

WVP1 = WVP1 * m2;

Per the Microsoft Docs Programming Guide, XMVECTOR and XMMATRIX should in most cases be thought of as proxies for SIMD registers, not as data types. For example, if you have a class and you make XMVECTOR or XMMATRIX a member of that class, then the whole class has to be 16-byte aligned. While this is generally true for x64 native code, it is NOT true for x86 code.

If you are new to DirectXMath, take a look at SimpleMath in the DirectX Tool Kit.