0

我第一次编写包装器并使用许多不同的头文件,但遇到了问题。我无法将 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);

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

谢谢

4

1 回答 1

1

您应该使用XMFLOAT4X44x4 浮点矩阵的“内存类型”,它没有对齐要求。它的结构布局与D3DMATRIX.

XMMATRIX m2 = XMLoadFloat4x4(reinterpret_cast<const XMFLOAT4X4*>(pMatrix));

WVP1 = WVP1 * m2;

根据Microsoft Docs Programming GuideXMVECTOR并且XMMATRIX在大多数情况下应被视为 SIMD 寄存器的代理,而不是数据类型。例如,如果您有一个类并且您是该类XMVECTORXMMATRIX成员,那么整个类必须是 16 字节对齐的。虽然这通常适用于 x64 本机代码,但不适用于 x86 代码。

如果您是 DirectXMath 的新手,请查看DirectX Tool Kit中的SimpleMath

于 2021-09-17T03:15:22.300 回答