将DirectX SDK代码转换为新的Windows 8.1 SDK代码

时间:2013-09-09 20:47:00

标签: c++ sdk directx

我正在创建一个视频游戏+引擎。我找到了some really amazing tutorials on DirectX 11 programming at RasterTek。不幸的是,他们使用折旧的DirectX SDK,我使用VS 2013和Windows SDK中包含的新DirectX SDK。

我正在转换代码以使用Windows SDK,但我在教程4上遇到了一些问题(是的,我将转换所有49个教程,可能会有更多问题)

Working with D3DXMath,我被告知D3DXVECTOR3应转换为XMFLOAT3。 然后我尝试在D3DXVec3TransformCoord中使用这些XMFLOAT3,它已被转换为XMVector3TransformCoord

示例:

XMFLOAT3 up, position, lookAt;

// Setup the vector that points upwards.
up.x = 0.0f
up.y = 1.0f
up.z = 0.0f

// Setup the position of the camera in the world.
position.x = m_positionX;
position.y = m_positionY;
position.z = m_positionZ;

// Setup where the camera is looking by default.
lookAt.x = 0.0f;
lookAt.y = 0.0f;
lookAt.z = 1.0f;

// Transform the lookAt and up vector by the rotation matrix so the view is correctly rotated at the origin.
XMVector3TransformCoord(lookAt, rotationMatrix);
XMVector3TransformCoord(up, rotationMatrix);

我收到错误:

  

IntelliSense:没有合适的用户定义转换   “DirectX :: XMFLOAT3”到“DirectX :: XMVECTOR”存在

我发现我可以使用XMLoadFloat3

进行TypeCast查找
XMVector3TransformCoord(XMLoadFloat3(&lookAt), rotationMatrix);
XMVector3TransformCoord(XMLoadFloat3(&up), rotationMatrix);

我应该这样做,和/或这是最好的方法吗?

完成此操作后,我尝试:

// Translate the rotated camera position to the location of the viewer.
lookAt = position + lookAt;

并收到错误:

  

IntelliSense:没有运算符“+”匹配这些操作数               操作数类型是:DirectX :: XMFLOAT3 + DirectX :: XMFLOAT3

我能够在D3DXVECTOR3上使用+运算符,但现在不能使用XMFLOAT3?如何将它们一起添加?

2 个答案:

答案 0 :(得分:2)

  

我应该这样做,和/或这是最好的方法吗?

使用 XMVECTOR 代替XMFLOAT3,因为DriectXMath中的大多数功能都使用XMVECTOR。因此,您可以避免无聊的类型转换,并使您的代码清洁。

  

我能够在D3DXVECTOR3上使用+运算符,但现在不能使用XMFLOAT3?   如何将它们一起添加?

再次使用 XMVECTOR 代替XMFLOAT3

XMVECTOR也有一些缺点(我的意思是代码看起来有点复杂)。使用D3DXVECTOR3,您可以简单地将变量初始化为D3DXVECTOR3 a(x,y,z,w)并将其组件作为a.x,a.y,...但XMVECTOR使用不同的方式。

要初始化XMVECTOR,请使用XMVectorSet函数。

XMVECTOR lookAt = XMVectorSet(x, y, z, w);

要获取XMVECTOR的组件,请使用以下函数。

  • XMVectorGetX
  • XMVectorGetY
  • XMVectorGetZ
  • XMVectorGetW

答案 1 :(得分:2)

<强> 1。我应该吗?

  

我应该这样做,和/或这是最好的方法吗?

一般来说,您使用Windows SDK编写新代码,但不必转换任何旧代码(您的代码,尤其是其他代码)。这只是浪费时间。您可以安装DirectX SDK以便能够构建它。

另一方面,这是一个了解DrectX及其基础设施的更好机会。例如,从D3DXMath到DirectXMath(以前的XMMath),您将学习基于SSE的数学库的优缺点,并且它是开始编写自己的数学库的好地方。

<强> 2。怎么样?

如果你真的决定做这项艰苦的工作,那么你可以在Chuck Walbourn的一篇好文章中找到90%的信息 - MSFT: Living without D3DX。 另外9.9%你将自己从documentation中找到,并且在查看DirectXMath源代码时会增加0.1%(它是一个头库,所有内联函数都可以自由学习它们)。 您可能也会对MSDN上的another articles by that guy感兴趣。

第3。 operator+问题

新数学包含两种类型:D3DXVECTORnn,而不是单XMFLOATn类型(其中XMVECTOR是多个组件)。对于矩阵也是如此:XMMATRIXXMFLOATaXb(其中ab是矩阵的维度。)

  • XMFLOAT人们将被用来存储价值观。它只是一个普通的花车。除了XMLoad* / XMStore*接受它们之外,没有为它们定义的运算符和任何函数。
  • XMVECTORXMMATRIX是一个工作马:它们在所有函数中使用,并且还有重载运算符(不建议使用。使用XM*函数)。他们使用超音速SSE内部。但是......很难用它来存储价值。例如,如果您创建XMVECTOR类成员,则会出现对齐问题。
  • 因此,基本上,您可以在XMFLOAT s中存储和移动您的值,但在进行任何计算之前,您可以使用XMVECTOR函数将它们转换为XMMATRIXXMLoad* (正如您对XMVector3TransformCoord()所做的那样),并且在计算之后,您使用XMFLOAT函数将它们转换回XMStore* s。或者您可以通过正确对齐classstruct来获得更多利润,这样您就可以直接存储XMVECTORXMMATRIX(可能需要对齐)内存分配器)。
嗯,现在你准备好了。快乐的移植! =)