尝试将矩阵存储在结构体中时,使用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)*pSource
的XMLoadFloat4X4()
指针为NULL
,满足该函数的Assert条件。首先,传递的指针未初始化,然后我尝试在[堆上]设置指针。设置了一个监视,并使用
XMFLOAT4X4
将XMStoreFloat4X4()
值初始化为矩阵标识。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
指针实际上是在这里设置的吗?