【问题标题】:DirectX 11: Runtime Assertion Failure using XMLoadFloat4X4()DirectX 11:使用 XMLoadFloat4X4() 的运行时断言失败
【发布时间】:2014-12-23 09:13:45
【问题描述】:

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

这些值简单地存储为:

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)*pSource 指向 XMLoadFloat4X4() 的指针是 NULL,满足函数的断言条件。传递的指针一开始是未初始化的,然后我尝试在[堆上]设置指针。

设置了一个手表,并使用XMStoreFloat4X4()XMFLOAT4X4 值初始化为矩阵恒等式。

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

最后的罪魁祸首是转换函数有很多重载,而我错过了之前的一个杂散调试步骤(我在其中一个函数中设置了一个新的XMFLOAT4X4 变量并且从未初始化它)。问题已解决。

【问题讨论】:

    标签: c++ debugging directx-11 assertions


    【解决方案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指针真的设置在这里了吗?

    【讨论】:

    • 我尝试在构造函数Entity(){e_Asset...sformation.f4x4Scale=new XMFLOAT4X4(...)} 中设置值(手动输入单位矩阵)。不过我可以尝试另一种方式。
    • &psource is 但在运行时为 NULL。
    • 为什么堆分配单个XMFLOAT4X4 实例?只需将它们作为值成员放在您的 Entity 类中即可。
    • 好点。这就是我最终做的事情。XMFLOAT4X4 Rotation;。最初,我只是添加功能,以便可以将 e_Asset 结构存储在我的物理管道中,但错误让我措手不及。 (我以为Rotation 填充了一个较早的函数)我不知道为什么我选择了一个堆实现。我认为由于一些奇怪的大脑逻辑,它朝那个方向发展 - const XMFLOAT4X4* pSource(指针)让我以 XMFLOAT4X4* 的形式存储在结构中,而我的手刚刚写出 ...= new XMF... 结构的很大一部分没有先决条件依次实现,NULL / not init ...
    • Xbox 360 的原始 xboxmath 库是为支持 C 和 C++ 编译而编写的。 XNAMath 必须在与 xboxmath 相同的地方编译,所以我必须让它在 C 中工作,以便在内部 Xbox 360 OS 软件中使用。使用 DirectXMath,我放弃了对 Xbox 360 的支持以及支持 C 的要求,但同时我不想要求所有现有的 XNAMath 客户端都必须彻底改变才能迁移到 DirectXMath。因此,虽然理想情况下应该是 XMMATRIX XMLoadFloat4x4(const XMFLOAT4X4& source);,因为 null 不是一个有效的选项,但它不是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多