The specular highlight is calculated in the standard way using the Blinn simplification..it based on the halfvector between the angle of light incidence and view position...theres no reason to move it around. The lighting should be correct from all angles.

Using fog is not difficult. just add this stuff to the first pass:
fist declare these at he beginning:
float4 vecViewPos;
float4 vecFog;

thi in the vs output struct:
float Fog : FOG;

then in the vertex shader:
float ofog = 1 - (distance(PosWorld, vecViewPos) - vecFog.x) * (vecFog.z);
Out.Fog = ofog;

now you must do the same thing for the otehr passes, except vertex shaders put this instead:
Out.Fog = 10000;
the resaon is you only want to calculate foging correctly one the first pass, the passes you make fog way way out so it is bascially disabled. Then you should get corect fog color. Just make sure you lights arent visible form a long way away.