尝试在结构中存储矩阵时,在使用XMFLOAT4x4*
从结构调用XMLoadFloat4X4()
类型时,在运行时收到Assertion Failure错误。
这些值只是存储为:
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
的{{1}}指针是XMLoadFloat4X4()
,满足该函数的Assert条件。传入的指针最初是未初始化的,然后我尝试在堆上设置指针。
已设置监视,并使用NULL
将XMFLOAT4X4
值初始化为矩阵标识。
XMStoreFloat4X4()
最后的罪魁祸首就是变换函数有如此多的重载这一事实,我错过了一个杂散的调试步骤(我在其中一个函数中设置了一个新的XMMATRIX Identity = XMMatrixIdentity();
XMStoreFloat4x4(&e_Asset.Asset.FileDesc.matrixTransformation.f4x4_Scale, Identity);
变量并且从未初始化它)。问题已经解决。
答案 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
指针实际上是在这里设置的吗?