return reflect(direction, normal);
The environment mapping appears much more accurate with the correct reflection vector:
When performing reflection, the normal vector should be normalized. Why? What might happen if it is not of unit length?