如何在 DirectX 中初始化 XMVECTOR?

1 c++ directx

我刚刚开始使用 DirectXMath。我想使用 \nIntersects 函数来检查两个三角形是否相交。但每次我调用该函数时,都会出现异常。我认为这是因为我没有以正确的方式创建 XMVECTOR 参数。我尝试了两种方法:

\n\n
DirectX::XMVECTOR r = DirectX::XMVectorSet(m_x, m_y, m_z, 1.0f);\nDirectX::XMVECTORI32 t = { m_x, m_y, m_z, 1.0f };\n
Run Code Online (Sandbox Code Playgroud)\n\n

这两种方式都不起作用,并且由于 XMVECTOR 没有 xc2\xb4t 有 xyz 成员,我无法理解这种数据类型的工作原理。

\n\n

我真的很感激一些帮助!提前致谢!

\n

Chu*_*urn 7

实际上,到目前为止,线程中提到的所有方法都是有效的方法,但具有不同的用途和性能影响。

如果您想创建四个浮点常量值的“向量化常量”,最好的答案是使用XMVECTORF32

static const XMVECTORF32 s_MyValue = { 1.f, 2.f, 3.f, 4.f };
Run Code Online (Sandbox Code Playgroud)

编译器通常能够将其放入程序的数据段中,因此在运行时您只需调用MOVAPS以将数据放入 SSE 寄存器即可。

和类型执行相同的操作XMVECTORU32XMVECTORI32但假设您希望将元素初始化为 anunsigned int或 anint通常用于按位或选择操作,因为 DirectXMath 库不会实现多个整数操作。

XMFLOAT4如果您将数据存储在内存中,一个好的解决方案是在数据结构中使用并使用XMLoadFloat4将其放入XMVECTOR

XMVECTOR v = XMLoadFloat4(&myClass.myValue);
// This is equivalent in SSE to using _mm_loadu_ps
Run Code Online (Sandbox Code Playgroud)

DirectXMath 库中的绝大多数类型旨在用于数据结构。您可以使用XMVECTORXMMATRIX进行所有计算,使用加载和保存例程将数据传入和传出这些类型。

如果您需要从一组 4 个标量浮点变量设置一个向量,则如下XMVectorSet

XMVECTOR v = XMVectorSet( m_x, m_y, m_y, 1.f );
// This is equivalent in SSE to using _mm_set_ps.
Run Code Online (Sandbox Code Playgroud)

如果您希望将单个标量值加载到所有四个位置,您可以使用:

XMVECTOR v = XMVectorReplicate( m_a );
// This is equivalent in SSE to using _mm_set_ps1.
Run Code Online (Sandbox Code Playgroud)

如果您想将标量值从内存中的值加载到所有四个位置,另一个选项是:

XMVECTOR v = XMVectorReplicatePtr( &m_a );
// This is equivalent in SSE to using _mm_load_ps1.
// If you were building with /arch:AVX, it would be _mm_broadcast_ss
Run Code Online (Sandbox Code Playgroud)

还有一些特殊用例的函数,例如XMVectorSetX/ XMVectorSetXPtrXMVectorSetY/ XMVectorSetYPtrXMVectorSetZ/ XMVectorSetZPtrXMVectorSetW/XMVectorSetWPtr以及相当慢的XMVectorSetByIndex/ XMVectorSetIndexPtr

如果您是 DirectXMath 新手,请花一些时间阅读DirectXMath 编程指南。它不是特别长,但充满了信息和提示。

另请参阅 DirectXMath 简介和我关于该主题的其他博客文章。另请务必查看GitHub 项目

有些人发现 DirectXMath 的 SIMD 友好对齐规则有点令人沮丧,尤其是当他们刚开始使用时,这就是为什么我还创建了包含在DirectX 工具包中的SimpleMath 包装器。在这种情况下,您将使用类似于then 的东西,您可以在任何需要使用的地方使用.Vector4 v( m_x, m_y, m_z, 1.f );vXMVECTOR