我刚刚开始使用DirectXMath。我想用相交功能可检查两个三角形是否相交。但是每次我调用该函数时,都会得到一个例外。我认为这是因为我没有以正确的方式创建XMVECTOR参数。我尝试了两种方法:DirectX::XMVECTOR r = DirectX::XMVectorSet(m_x, m_y, m_z, 1.0f);DirectX::XMVECTORI32 t = { m_x, m_y, m_z, 1.0f };两种方法都不起作用,并且由于XMVECTOR没有x y z成员,所以我很难理解这种数据类型的工作方式。我真的很感谢您的帮助!提前致谢! 最佳答案 实际上,到目前为止,线程中提到的所有方法都是有效的方法,但是具有不同的用途和性能含义。如果要创建四个浮点常量值的“向量常量”,最好的答案是使用XMVECTORF32:static const XMVECTORF32 s_MyValue = { 1.f, 2.f, 3.f, 4.f };编译器通常可以将其放入程序的数据段中,因此在运行时,您只需结束调用MOVAPS将数据放入SSE寄存器中即可。  XMVECTORU32和XMVECTORI32类型的功能相同,但是假设您要将元素初始化为unsigned int或int通常用于按位或选择操作,因为DirectXMath库实现的功能不止于此。一些整数运算。如果要将数据存储在内存中,一个好的解决方案是在数据结构中使用XMFLOAT4并使用XMLoadFloat4将其放入XMVECTOR:XMVECTOR v = XMLoadFloat4(&myClass.myValue);// This is equivalent in SSE to using _mm_loadu_ps  DirectXMath库中的绝大多数类型旨在用于数据结构。您可以使用XMVECTOR和XMMATRIX进行所有计算,并使用装入和保存例程来使数据进出这些类型。如果您需要从一组4个标量浮点变量中设置一个向量,那么XMVectorSet就是这样的:XMVECTOR v = XMVectorSet( m_x, m_y, m_y, 1.f );// This is equivalent in SSE to using _mm_set_ps.如果要将单个标量值加载到所有四个位置,则可以使用:XMVECTOR v = XMVectorReplicate( m_a );// This is equivalent in SSE to using _mm_set_ps1.如果要将标量值从内存中的值加载到所有四个位置,则另一个选择是: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还有一些特殊用途的函数,例如XMVectorSetX / XMVectorSetXPtr,XMVectorSetY / XMVectorSetYPtr,XMVectorSetZ / XMVectorSetZPtr,XMVectorSetW / XMVectorSetWPtr和相当慢的XMVectorSetByIndex / 。如果您不熟悉DirectXMath,请花一些时间通读DirectXMath Programming Guide。它并不特别长,并且包含许多信息和提示。另请参见Introducing DirectXMath和我的其他blog posts。另外,请确保签出GitHub project。  有些人发现DirectXMath的SIMD友好对齐规则有些令人沮丧,尤其是当它们刚开始使用时,这就是为什么我还创建了SimpleMath wrapper的原因,该DirectX Tool Kit包含在中。在这种情况下,您可以使用XMVectorSetIndexPtr之类的东西,然后可以在任何使用Vector4 v( m_x, m_y, m_z, 1.f );的地方使用v。关于c++ - 如何在DirectX中初始化XMVECTOR?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50906891/
10-15 04:31