Normalize a 3D vector.
nrm dst, src |
---|
where
Pixel shader versions | 1_1 | 1_2 | 1_3 | 1_4 | 2_0 | 2_x | 2_sw | 3_0 | 3_sw |
---|---|---|---|---|---|---|---|---|---|
nrm | x | x | x | x | x |
This instruction works conceptually as shown here.
squareRootOfTheSum = (src0.x*src0.x + src0.y*src0.y + src0.z*src0.z)1/2; dest.x = src0.x * (1 / squareRootOfTheSum); dest.y = src0.y * (1 / squareRootOfTheSum); dest.z = src0.z * (1 / squareRootOfTheSum); dest.w = src0.w * (1 / squareRootOfTheSum);
The dest and src registers cannot be the same. The dest register must be a temporary register.
This instruction performs the linear interpolation based on the following formula.
float f = src0.x*src0.x + src0.y*src0.y + src0.z*src0.z; if (f != 0) f = (float)(1/sqrt(f)); else f = FLT_MAX; dest.x = src0.x*f; dest.y = src0.y*f; dest.z = src0.z*f; dest.w = src0.w*f;