将 DirectX SDK 代码转换为新的 Windows 8.1 SDK 代码
Converting DirectX SDK code to new Windows 8.1 SDK Code
我目前正在创建一个视频游戏+引擎。我在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
是多个组件),而是包含两种类型:XMFLOATn
和 XMVECTOR
。矩阵也是如此:XMMATRIX
和 XMFLOATaXb
(其中 a
和 b
是矩阵的维度)。
-
XMFLOAT
人们将用于存储值。它只是一个普通的漂浮物。没有为它们定义运算符,也没有函数,除了XMLoad*
/XMStore*
接受它们。 -
XMVECTOR
和XMMATRIX
是一匹工作马:它们用于所有功能,并且还具有重载运算符(不建议使用。请改用XM*
函数)。他们使用超音速SSE内部。但。。很难用它来存储值。例如,如果将类XMVECTOR
成员,则会遇到对齐问题。 - 因此,基本上,您以
XMFLOAT
s 为单位存储和移动您的值,但在进行任何计算之前,您使用XMLoad*
函数将它们转换为XMVECTOR
和XMMATRIX
(就像您对XMVector3TransformCoord()
所做的那样),计算后,您使用XMStore*
函数将它们转换回XMFLOAT
s。或者,您可以通过正确对齐class
es 和struct
s 来获得更多利润,这样您就可以直接存储XMVECTOR
和XMMATRIX
(可能需要对齐的内存分配器)。
好了,现在你准备好了。祝您移植愉快!=)
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 将 DirectX SDK 代码转换为新的 Windows 8.1 SDK 代码
- 需要基本示例代码编译帮助 - 我无法获得任何 SDK 示例