矩阵导致崩溃

时间:2013-01-11 23:35:11

标签: c++ matrix direct3d11 xna-math-library

我的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:通过几十项更改,我设法让Projection和World矩阵工作。虽然我仍然无法设置View矩阵。我更改了代码,因此它与实际代码匹配,并删除了不重要的内容。

编辑 @ 2:来自最后一分钟的新闻:XMMatrixLookAtLH函数没有问题,因为我决定将结果保存到局部变量并且它可以工作,但是如果我想分配结果矩阵到类成员然后我得到了崩溃。这当然很有趣。

2 个答案:

答案 0 :(得分:5)

花了几个小时试图解决这个问题,我相信我终于解决了它。

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);
}

答案 1 :(得分:3)

由于崩溃发生在分配时: m_ViewMatrix = XMMatrixLookAtLH(...

并且构建在x64中比x86更好,我认为m_ViewMatrix甚至它的容器m_Camera都映射到与其他东西共享的内存空间中。记忆蚀刻。转向64位是另一个指标,因为可能已经移动了内存以隐藏问题。

您是如何分配m_Camera字段的?什么是一切的主要容器?

发布完整的CameraClass标题以及分配它的位置。此外,尝试在字段周围的一些阵列中撒一点,看看是否有帮助。这也意味着内存崩溃。

相关问题