我在看DirectX SDK中的教程。教程5可以正常工作,但是在将代码复制并分离到自己的类之后,启动应用程序时遇到了奇怪的错误。
该行是:
g_World1 = XMMatrixIdentity();
因此,xnamathmatrix.int operator =中出现错误,看起来像这样:
XMFINLINE _XMMATRIX& _XMMATRIX::operator=
(
CONST _XMMATRIX& M
)
{
r[0] = M.r[0];
r[1] = M.r[1];
r[2] = M.r[2];
r[3] = M.r[3];
return *this;
}
错误消息是:
Access violation reading location 0xffffffff
我在某处读到它可能是由连接到XMFLOAT4X4/XMMATRIX的东西引起的:
但是我想我已经在使用XMMATRIX。
MyClass.h:
private:
XMMATRIX g_World1;
MyClass.cpp:
void init(){
g_World1 = XMMatrixIdentity();
}
我不认为我应该更改XMMATRIX g_World1;到XMFLOAT4X4 g_World1,因为它会产生如下错误:
最佳答案
XMVECTOR和XMMATRIX是“注册代理”类型。您可以安全地将它们用作Xbox 360,Xbox One和Windows x64平台的类型,因为它们 native 对堆栈上的数据和在堆上分配的数据具有16字节对齐。
将它们用于Windows 32位或Windows RT/ARM需要花费更多的精力,因为 native 对齐方式的文件数少于16字节。一种方法是DirectX Tool Kit使用的技术...它使用pImpl习惯用法,并且pImpl内部类以16字节对齐方式明确分配,这是直接使用XMVECTOR和XMMATRIX类型的地方。另一种方法是使用所有各种“存储”类型,例如XMFLOAT4和XMFLOAT4X4。
注意:DirectXMath programmer's guide涵盖了这一点。它不是一个冗长的文档,并且包含许多提示和建议。
PS:MSDN代码库上有Win32桌面的标准Direct3D教程版本,不需要DirectX SDK ...它仅使用VS 2012或VS 2013附带的Windows 8.x SDK。enter link description here