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

Converting DirectX SDK code to new Windows 8.1 SDK Code

本文关键字:代码 SDK Windows DirectX 转换      更新时间:2023-10-16

我目前正在创建一个视频游戏+引擎。我在RasterTek上找到了一些关于DirectX 11编程的非常惊人的教程。不幸的是,他们使用已弃用的DirectX SDK,而我正在使用VS 2013和Windows SDK中包含的新DirectX SDK。

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

在使用 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);

我收到一个错误:

智能感知:没有合适的用户定义转换 存在"DirectX::XMFLOAT3"到"DirectX::XMVECTOR"

我发现我可以使用 XMLoadFloat3 进行 TypeCast lookAt 和向上:

XMVector3TransformCoord(XMLoadFloat3(&lookAt), rotationMatrix);
XMVector3TransformCoord(XMLoadFloat3(&up), rotationMatrix);

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

完成此操作后,我尝试:

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

并得到错误:

智能感知:没有运算符"+"与这些操作数匹配 操作数类型包括:DirectX::XMFLOAT3 + DirectX::XMFLOAT3

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

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

使用 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);

若要获取 XM 矢量的组件,请使用以下函数。

  • XMVectorGetX
  • XMVectorGetY
  • XMVectorGetZ
  • XMVectorGetW

1. 我应该吗?

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

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

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

2. 如何?

如果你真的决定做这项艰苦的工作,那么你会在查克·沃尔伯恩(Chuck Walbourn)的一篇好文章中找到90%的信息 - MSFT:没有D3DX的生活。另外 9.9% 你会自己从文档中弄清楚,还有 0.1% 来自查看 DirectXMath 源代码(它是一个头库,所有函数都是内联的,你可以自由学习它们)。您可能还会对那个人在MSDN上发表的另一篇文章感兴趣。

3. operator+问题

新数学不是单一的D3DXVECTORn类型(其中n是多个组件),而是包含两种类型:XMFLOATnXMVECTOR 。矩阵也是如此:XMMATRIXXMFLOATaXb(其中 ab 是矩阵的维度)。

  • XMFLOAT人们将用于存储值。它只是一个普通的漂浮物。没有为它们定义运算符,也没有函数,除了XMLoad*/XMStore*接受它们。
  • XMVECTORXMMATRIX 是一匹工作马:它们用于所有功能,并且还具有重载运算符(不建议使用。请改用XM*函数)。他们使用超音速SSE内部。但。。很难用它来存储值。例如,如果将类XMVECTOR成员,则会遇到对齐问题。
  • 因此,基本上,您以 XMFLOAT s 为单位存储和移动您的值,但在进行任何计算之前,您使用XMLoad*函数将它们转换为 XMVECTORXMMATRIX(就像您对 XMVector3TransformCoord() 所做的那样),计算后,您使用XMStore*函数将它们转换回 XMFLOAT s。或者,您可以通过正确对齐class es 和 struct s 来获得更多利润,这样您就可以直接存储XMVECTORXMMATRIX(可能需要对齐的内存分配器)。

好了,现在你准备好了。祝您移植愉快!=)