Sign in to follow this  
hdxpete

HLSL distance vs dot

Recommended Posts

Doing point lights in one of my shaders recently. Someone with more experience then i suggested i use distance as opposed to dot for the attenuation calculations

so i wrote
attenFactors.z = dot(lightPos, lightPos);
attenFactors.y = sqrt(attenFactors.z);

this person suggested i rewrite it to
attenFactors.y = distance(lightPos);
attenFactors.z = attenFactors.y * attenFactors.y;

to me they are equivalent operations so i thought that mine would be slightly faster since im removing a multiplication. however we are talking 1 operation right?. so does it really matter?

Share this post


Link to post
Share on other sites
Functionally those are exactly the same. Dotting a vector with itself is equal summing the squares of its components, which is exactly what distance() will do. I would guess that once the code is optimized you'd also end up running the exact same instructions, at least on a modern GPU that uses scalar operations per-thread. Code like that usually comes from people writing for older GPU's where it might actually issue a dedicated dot product instruction. Edited by MJP

Share this post


Link to post
Share on other sites
The hardware may or may not have a native dot product instruction, it would depend on the GPU. The internal ISA actually changes pretty frequently among different chipset versions, and like I mentioned before the latest architectures from both Nvidia and AMD both only use scalar instructions.

distance() does compute the square root of the sum, I just left that part out for brevity.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this