尝试将矩阵存储在结构体中时,使用XMFLOAT4x4*从结构体调用XMLoadFloat4X4()类型时,在运行时收到断言失败错误。



这些值仅存储为:

XMFLOAT4X4 *f4x4_Scale;
XMFLOAT4X4 *f4x4_Rotation;
XMFLOAT4X4 *f4x4_Translate;
XMFLOAT4X4 *f4x4_ObjectViewSpace;


大概是从结构内部的XMFLOAT4x4*位置加载实际值。

我在转换函数内部调用XMLoadFloat4X4(),其结构如下:

XMMATRIX Entity::Scale(float x, float y, float z){
    XMMATRIX m_Scale = XMLoadFloat4x4(e_Asset.Asset.FileDesc.matrixTransformation.f4x4_Scale);
    m_Scale = XMMatrixScaling(x, y, z);
    return m_Scale;
}


反汇编显示了XMLoadFloat4x4()函数本身内部的中断,但我无法理解。


有什么方法/方法可以用来解决有关XMLoadFloat()的断言失败错误? (或者关于断言错误的真正好的材料)和/或我做错了什么?

更新:

正如Chuck Walbourn所建议的,(XMFLOAT4X4)*pSourceXMLoadFloat4X4()指针为NULL,满足该函数的Assert条件。首先,传递的指针未初始化,然后我尝试在[堆上]设置指针。

设置了一个监视,并使用XMFLOAT4X4XMStoreFloat4X4()值初始化为矩阵标识。

XMMATRIX Identity = XMMatrixIdentity();
XMStoreFloat4x4(&e_Asset.Asset.FileDesc.matrixTransformation.f4x4_Scale, Identity);


最终的罪魁祸首是,转换函数有这么多的重载,而我错过了一个较早的调试步骤(我在其中一个函数中设置了一个新的XMFLOAT4X4变量,但从未对其进行初始化)。问题已解决。

最佳答案

DirectXMath是库中的共享源,因此您可以直接进入调试器中的功能。

XMLoadFloat4x4中的唯一断言是验证输入指针不为空:

/------------------------------------------------------------------------------
_Use_decl_annotations_
inline XMMATRIX XMLoadFloat4x4
(
    const XMFLOAT4X4* pSource
)
{
    assert(pSource);
#if defined(_XM_NO_INTRINSICS_)


您认为e_Asset.Asset.FileDesc.matrixTransformation.f4x4_Scale指针实际上是在这里设置的吗?

08-17 11:26