矩阵导致崩溃
Matrices causing crash
我的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 );
提前,顶点和像素着色器编译得很好,所以这不是问题。最有可能的是,我在xnamath上做错了什么(我对它完全陌生),但我不知道这到底是什么。提前感谢。如果需要的话,我会提供更多的信息。
编辑@1:经过数十次更改,我设法使投影和世界矩阵工作。虽然我仍然不能设置视图矩阵。我修改了代码,使其与实际匹配,并删除了不重要的内容。
编辑@2:从最后一分钟突发新闻:没有问题与XMMatrixLookAtLH函数,因为我决定将结果保存到局部变量,它的工作,但如果我想分配结果矩阵类成员,然后我得到崩溃。
花了好几个小时试图解决这个问题,我相信我终于解决了。
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);
}
由于崩溃发生在赋值时:m_ViewMatrix = XMMatrixLookAtLH(…
和构建沿着更好的x64比x86我会假设m_ViewMatrix或甚至它的容器m_Camera映射在一个内存空间,是与其他东西共享。内存clobering。转移到64位是另一个指示器,因为可能已经移动内存来隐藏问题。
你如何分配m_Camera字段?什么是所有东西的主要容器?
张贴完整的CameraClass头和你在哪里分配它。另外,尝试在字段周围散布一些数组,看看是否有帮助。
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- 试图创建流或fopen时程序崩溃
- 类对象数组的问题会导致崩溃
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 为什么要增加导致崩溃的指针
- 在虚幻引擎中删除NXOpen对象时崩溃
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- Visual Studio在尝试读取resource.txt文件时崩溃
- 将方法转换为调用该方法的成员函子对象会导致崩溃