【发布时间】:2014-09-28 19:19:43
【问题描述】:
我正在尝试在 D3D 中为我的 Camera 类实现 Pitch/Yaw,但我的 Pitch() 函数会引发“访问冲突读取位置 0x0000008C”。
我用谷歌搜索了一下,发现由于 16 位对齐,我不能在类/结构中使用 XMVECTOR。但是我已经知道了,我仔细检查了它是否被声明为 XMFLOAT3 并且确实如此!
问题是,在我的相机类的所有其他函数中(比如更新视图矩阵,...)都不会抛出异常。就在这一个功能中!
所以,下面是我声明使函数崩溃的类变量的方法(尽管我的所有变量都会使其崩溃,并且它们的定义方式相同):
XMFLOAT3 mRight;
以下是我声明 Pitch 函数的方式:
void Pitch(float a)
{
//Here it makes my code crash
XMMATRIX R = XMMatrixRotationAxis(XMLoadFloat3(&mRight), a);
//Store and compute
XMStoreFloat3(&mLook, XMVector3TransformNormal(XMLoadFloat3(&mLook), R));
XMStoreFloat3(&mUp, XMVector3TransformNormal(XMLoadFloat3(&mUp), R));
}
我也使用 x86 作为架构,尽管 x64 给出了完全相同的结果(除了内存位置:D)。 I 或 DirectXMath 库都无法访问“mRight”的 x、y 和 z 值。在我的例子中,DirectXMath 中的“mRight.x”是“__m128 x = _mm_load_ss(&pSource->x);”。
一些新的调试结果: 当我从 WM_MOUSEMOVE 事件中调用“任何”函数时,会发生这种奇怪的情况。甚至我的函数 Walk(),当我按下一个键时调用它时它也能完美运行。
有史以来最奇怪的事情!
感谢您的帮助!
【问题讨论】:
-
你的目标架构是什么? x86 还是 x64?如果你正在为 x86 构建,那么你不能假设你的变量是 16 位对齐的。此外,如果您使用调试器单步执行代码以准确查看异常发生的位置,可能会更有帮助。这很容易,因为 DirectXMath 是开源的。
-
我的目标架构是 x86,尽管 x64 给出了相同的结果。 2 分:我确实这样做了,它发生在我(或 DirectXMath)尝试访问 x、y、z 位置“mRight”时。在 DirectXMath 的情况下,它位于“__m128 x = _mm_load_ss( &pSource->x );”感谢您的帮助顺便说一句
标签: c++ direct3d memory-alignment directxmath