我在看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

08-25 22:32