DirectX 11:使用XMLoadFloat4X4()运行时断言失败

时间:2014-10-28 03:14:00

标签: c++ debugging directx-11 assertions

尝试在结构中存储矩阵时,在使用XMFLOAT4x4*从结构调用XMLoadFloat4X4()类型时,在运行时收到Assertion Failure错误。

enter image description here

这些值只是存储为:

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()函数本身有一个中断,但我无法理解它。 enter image description here

我是否可以使用一种方法/方法来解决与XMLoadFloat()相关的断言失败错误? (或者关于断言错误的确实很好的材料)和/或我做错了什么?

更新

正如Chuck Walbourn所建议的,(XMFLOAT4X4)*pSource的{​​{1}}指针是XMLoadFloat4X4(),满足该函数的Assert条件。传入的指针最初是未初始化的,然后我尝试在堆上设置指针。

已设置监视,并使用NULLXMFLOAT4X4值初始化为矩阵标识。

XMStoreFloat4X4()

最后的罪魁祸首就是变换函数有如此多的重载这一事实,我错过了一个杂散的调试步骤(我在其中一个函数中设置了一个新的XMMATRIX Identity = XMMatrixIdentity(); XMStoreFloat4x4(&e_Asset.Asset.FileDesc.matrixTransformation.f4x4_Scale, Identity); 变量并且从未初始化它)。问题已经解决。

1 个答案:

答案 0 :(得分:1)

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指针实际上是在这里设置的吗?