矩阵导致程序崩溃

8

我有一个关于我的Direct3D11应用程序的问题,已经尝试解决几个小时了。问题在于这个方法:

void CameraClass::Render()
{
    XMFLOAT3 sUp, sLookAt, sRotationInRadians;

    sUp.x = 0.0f;
    sUp.y = 1.0f;
    sUp.z = 0.0f;

    sLookAt.x = 0.0f;
    sLookAt.y = 0.0f;
    sLookAt.z = 1.0f;

    sRotationInRadians.x = m_Rotation.x * 0.0174532925f;
    sRotationInRadians.y = m_Rotation.y * 0.0174532925f;
    sRotationInRadians.z = m_Rotation.z * 0.0174532925f;

    XMVECTOR vecLookAt = XMVectorSet( sLookAt.x, sLookAt.y, sLookAt.z, 0.0f );
    XMVECTOR vecUp = XMVectorSet( sUp.x, sUp.y, sUp.z, 0.0f );
    XMVECTOR vecPosition = XMVectorSet( m_Position.x , m_Position.y, m_Position.z, 0.0f );

    XMMATRIX RotationMatrix( XMMatrixRotationRollPitchYaw( sRotationInRadians.x, sRotationInRadians.y, sRotationInRadians.z ));

    vecLookAt = XMVector3TransformCoord( vecLookAt, RotationMatrix );
    vecUp = XMVector3TransformCoord( vecUp, RotationMatrix );

    vecLookAt += vecPosition;   

    m_ViewMatrix = XMMatrixLookAtLH( vecPosition, vecLookAt, vecUp );
}

直到它到达那一行,一切都很好:

m_ViewMatrix = XMMatrixLookAtLH( vecPosition, vecLookAt, vecUp );

某种情况下会导致应用程序崩溃(更准确地说,切换为未响应状态)。

以下是实际调用的样子:

XMMATRIX ViewMatrix;
XMMATRIX ProjectionMatrix;
XMMATRIX WorldMatrix;

m_D3D->BeginScene( 0.0f, 0.0f, 0.0f, 1.0f );

m_Camera->Render();

m_D3D->GetWorldMatrix( WorldMatrix );
m_D3D->GetProjectionMatrix( ProjectionMatrix );

提前声明,Vertex和Pixel着色器编译得很好,所以这不是问题。很可能我在xnamath上做错了什么(我完全是新手),但我不知道到底是什么。谢谢您提前帮助。如果需要的话,我会提供更多信息。
编辑@1:经过几十次修改,我设法让投影矩阵和世界矩阵正常工作了。但我仍然无法设置视图矩阵。我改变了代码,使其与实际代码匹配,并摆脱了不重要的部分。
编辑@2:最近有新发现:XMMatrixLookAtLH函数没有问题,因为我决定将结果保存到局部变量中,它可以工作,但如果我想将结果矩阵分配给类成员,则会崩溃。这肯定很有趣。

好的,我遇到了完全相同的错误。当代码尝试计算XMMatrixLookAtLH或任何XNA函数时,它就会神秘地崩溃。 - Caesar
1
尝试了一些方法之后,我最终通过将我的模式设置为64x构建来使其工作。不过仍在寻找为什么会发生这种情况的答案。 - Caesar
@AndrewBarber 我在这个问题上设置了悬赏,但问题是如果我发布一个带有我的代码的新问题,它会被关闭并认为是重复。然而我仍然需要展示我的代码。您认为我该如何做呢? - Caesar
@Caesar,如果你有任何问题,请提出不同的问题。请不要对帖子进行根本性的更改,而且编辑功能也不是为此而设计的。 - NullPoiиteя
@NullPointer,这是同一个问题,我只是用我的代码澄清了一下。而且,我没有编辑提问者的问题,只是在上面加了一些内容。 - Caesar
显示剩余2条评论
2个回答

4

经过多个小时的尝试,我相信我终于解决了这个问题。

XMMATRIX代表一个16字节对齐的矩阵,而XMMATRIX的非对齐分配会在你尝试复制该值时导致此错误。这就解释了为什么它并不总是发生以及为什么它在不同的模式下能够工作。

我找到的最佳解决方案是使用XMFLOAT4X4来存储该值。

以下是一个简单的示例:

#include <windows.h>
#include <xnamath.h>

class Camera
{
protected:
    XMFLOAT4X4  view_;
public:
    XMFLOAT4X4  const& Update()
    {
        XMStoreFloat4x4(&this->view_ , XMMatrixIdentity());
        return this->view_;
    }
};

int main()
{
    Camera* cam = new Camera;
    XMFLOAT4X4 const& mat = cam->Update();
    XMMATRIX x = XMLoadFloat4x4(&mat);
}

刚看到你的问题 - 我之前也遇到过同样的问题,这就是答案。实际上,这也基本上是微软推荐的做法。 - jcoder
参考 http://msdn.microsoft.com/en-gb/library/windows/desktop/ee418725(v=vs.85).aspx (这是DirectXMath而不是旧的XNA Math,但基本相同) - jcoder

2

由于崩溃发生在赋值语句上:m_ViewMatrix = XMMatrixLookAtLH(...),且在x64中运行比在x86中更好,我认为m_ViewMatrix甚至其容器m_Camera被映射到了与其他东西共享的内存空间,导致了内存破坏。转向64位是这一问题的另一个指标,因为可能已经移动了内存以隐藏这个问题。

你是如何分配m_Camera字段的?主容器是什么?

发布完整的CameraClass头文件和其中的分配位置。此外,尝试在字段周围加入一些数组,看看是否有所帮助。这也可能表明存在内存破坏问题。


似乎我无法编辑这篇帖子,因为我不是原始发布者。但如果你想查看我的代码审查修订或在GitHub上查看,请点击此处:https://github.com/mmajeed-Fanshawe/XNAError - Caesar
我想问一下,这个问题出现在哪种处理器和操作系统上? - GMasucci
2
@GMasucci,请阅读我的答案以查看解决方案。 - Caesar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接