我有一个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
答案 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包装器的一部分,它允许用户选择使用更简单的使用模型,同时防止意外使用较慢的转换路径给其他人。