Reputation: 30035
I need to calcuate the normals of some triangles where I have a vector of vertices where each vertex has x, y, z coordinates. i1, i2, i3 are the indices in the vector of the three vertices of a triangle.
I'm using <DirectXMath.h>
and wrote this which seems to work.
XMFLOAT3 normal;
///
XMVECTOR v1 = XMLoadFloat3(&XMFLOAT3(verts[i1].x, verts[i1].y, verts[i1].z));
XMVECTOR v2 = XMLoadFloat3(&XMFLOAT3(verts[i2].x, verts[i2].y, verts[i2].z));
XMVECTOR v3 = XMLoadFloat3(&XMFLOAT3(verts[i3].x, verts[i3].y, verts[i3].z));
XMVECTOR n = XMVector3Cross(XMVectorSubtract(v2 ,v1), XMVectorSubtract(v3 ,v1));
XMStoreFloat3(&normal, n);
However it appears to have more Loads and Stores than actual calculations and was wondering if there was a better way to actually do this? Or are the load and stores "cheap" operations?
I have to run this for every triangle and it's taking a large amount of time relative to the rest of my code so speed improvements would be welcome.
Upvotes: 3
Views: 1806
Reputation: 6793
Try adding #define _XM_NO_INTRINSICS_
prior to #include <DirectXMath.h>
. This will disable the use of SSE within the library, allowing the compiler more freedom to make its own optimizations.
Upvotes: 2