4

我目前正在创建一个视频游戏 + 引擎。我在 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);

我收到一个错误:

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

我发现我可以使用XMLoadFloat3 TypeCast lookAt 和 up :

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?我如何将这些加在一起?

4

2 回答 2

2

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

使用XMVECTOR而不是 XMFLOAT3,因为 DrietXMath 中的大多数函数都使用 XMVECTOR。因此您可以避免无聊的类型转换并使您的代码干净。

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

同样,使用XMVECTOR而不是 XMFLOAT3

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

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

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

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

  • XMVectorGetX
  • XMVectorGetY
  • XMVectorGetZ
  • XMVectorGetW
于 2013-09-10T01:53:27.903 回答
2

1. 我应该吗?

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

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

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

2. 怎么做?

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

3.operator+问题

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

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

好吧,现在你准备好了。快乐移植!=)

于 2013-09-10T06:13:40.673 回答