XMMatrixTranspose访问冲突读取位置0xFFFFFFFF

时间:2015-10-19 12:58:52

标签: c++ directx directx-11

我有一个DirectX 11项目,我正在使用所有章节中的Beginning DirectX 11 Game Programming书。我已经安装了相机并且它一直没有崩溃,但是最近在调试我的Obj Loader时我发现它一直在XMMatrixTranspose线上崩溃,我交换了我的视图矩阵和投影矩阵看看它是否特定于我的视图矩阵,而不是。

以下是导致错误的代码块

vMatrix = camera.GetViewMatrix();
vMatrix = XMMatrixTranspose(vMatrix);

pMatrix = XMMatrixPerspectiveFovLH(XM_PIDIV4, (float)(screenWidth / screenHeight), 0.01f, 100.0f);
pMatrix = XMMatrixTranspose(pMatrix);

这可以在我的DX11::Render函数中找到。这在我的main.cpp游戏循环中调用,如下所示。

MSG msg = { 0 };

while (msg.message != WM_QUIT)
{
    if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    else
    {
        directX->Update(0.0f);
        directX->Render();
    }
}

directX->Shutdown();

我的所有变量都有内存,而且这段代码以前一直在工作,当它开始这样做时会非常间歇地执行,但现在它似乎一直都是这样做的。

任何帮助和指导都会令人惊叹!我已经研究了几个小时,找不到任何有效的东西,我已经有这个问题大约7个小时了!它必须去!!

提前致谢。

更新现在又回到间歇性崩溃

更新2 我也在使用xnamath而不是DXMath

1 个答案:

答案 0 :(得分:1)

您应首先阅读MSDN程序员指南,特别是type usage guidelines

  

DirectXMath和XNAMath基本上是相同的库。 XNAMath只是2011年最新更新的旧版本。您应该转向使用DirectXMath。请参阅this blog post

最可能的问题是您尝试使用在堆上声明的XMMATRIX和/或XMMVECTOR类型(即在您使用new的类中) 是否适合x86(32位)和ARM版本。它恰好排列为x64本机代码,但这主要是一个快乐的事故。

换句话说,下面的代码将导致x86(32位)和ARM中的AV取决于内存的确切排列方式,但适用于x64 native:

struct A
{
    XMMATRIX m;
};

A a = new A;
a->m = XMMatrixIdentity();

要使其在所有体系结构上运行稳健,您需要使用:

struct A
{
    XMFLOAT4X4 m;
};

A a = new A;
XMStoreFloat4x4(&A->m, XMMatrixIdentity());

您使用XMFLOAT4X4或类似不需要在类中对齐的类型,然后使用显式的加载/保存功能。请注意,您还可以使用更紧凑的表单,例如XMFLOAT4X3,具体取决于您的矩阵内容。

或者,您可以使用SimpleMath中的DirectX Tool Kit包装器,它只会自动执行"自动化"通过C ++转换运算符和构造函数的强大功能。

struct A
{
    Matrix m;
};

A a = new A;
A->m = XMMatrixIdentity();
// Note this is redundant
// as the Matrix default constructor sets it to identity already.
  

此功能不是基本库的一部分,因为它具有一些性能影响。通过使其成为SimpleMath包装器的一部分,它允许用户选择使用更简单的使用模型,同时防止意外使用较慢的转换路径给其他人。