Hi. I would like to humbly point to this article, featuring both branching and branchless implementations that I believe improve on both Hughes—Möller and Stark. http://lolengine.net/blog/2013...
Yes, I'd seen that – nice work Sam!
I've been meaning to do a followup post to cover the paper Mikkel mentioned and the point David raised about stability. I'll include your method there too. Thanks for giving me the extra motivation!
Sorry I'm a bit late to the party, but is there any reason why crossing a vector with a swizzled version of itself with one component negated wouldn't work? Eg:
cross(v, float3(v.y, -v.z, v.x))