I tried every algorithm in here (http://aras-p.info/t...rage.html#intro) but every time I get wrong normals.

Well except the basic one.

half4 encode (half3 n, float3 view) { return half4(n.xyz*0.5+0.5,0); } half3 decode (half4 enc, float3 view) { return enc.xyz*2-1; }

This works perfectly but my specular keeps jumping around. I guess that would be a precision issue because of the 8bit target.

Well so then I try the next easiest thing which is storing X&Y and reconstructing Z like this:

half4 encode (half3 n, float3 view) { return half4(n.xy*0.5+0.5,0,0); } half3 decode (half2 enc, float3 view) { half3 n; n.xy = enc*2-1; n.z = sqrt(1-dot(n.xy, n.xy)); return n; }

And it's error all over again. The lighting changes with my view direction. (where I look at)

I tried this with both an R8G8B8A8 and R16G16 format but no change.

How is it that every encoding method I try fails.

Any idea what I'm fundamentally doing wrong ?

Normals are calculated this way:

float4x4 WorldView = mul(World, View); // Output view space normals output.Normal.xyz = mul(input.Normal, (float3x3)WorldView);