这篇文章是老外的,我只摘取了想要的,原文链接在底下。
1.直接存在RGB通道上。
half4 encode(half3 n){return half4(n.xyz*0.5+0.5,0);}
half3 decode(half4 c){return c.rgb*2-1;}
2.存储法线的XY在颜色通道上,计算Z
half4 encode(half3 n){return half4(n.xy*0.5+0.5,0.0);}
half3 decode(half2 c) { half3 n; n.xy = c*2-1; n.z = sqrt(1-dot(n.xy,n.xy)); return n; }
3.球面坐标(Spherical Coordinates)
#define kPI 3.1415926536f half4 encode (half3 n) { return half4((half2(atan2(n.y,n.x)/kPI, n.z)+1.0)*0.5,0,0); }
half3 decode (half2 enc) { half2 ang = enc*2-1; half2 scth; sincos(ang.x * kPI, scth.x, scth.y); half2 scphi = half2(sqrt(1.0 - ang.y*ang.y), ang.y); return half3(scth.y*scphi.x, scth.x*scphi.x, scphi.y); }4.Spheremap Transform
half2 encode (half3 n) { half2 enc = normalize(n.xy) * (sqrt(-n.z*0.5+0.5)); enc = enc*0.5+0.5; return enc; } half3 decode (half4 enc) { half4 nn = enc*half4(2,2,0,0) + half4(-1,-1,1,-1); half l = dot(nn.xyz,-nn.xyw); nn.z = l; nn.xy *= sqrt(l); return nn.xyz * 2 + half3(0,0,-1); }
5.Lambert Azimuthal Equal-Area projection
half2 encode (half3 n) { half f = sqrt(8*n.z+8); return n.xy / f + 0.5; } half3 decode (half4 enc) { half2 fenc = enc*4-2; half f = dot(fenc,fenc); half g = sqrt(1-f/4); half3 n; n.xy = fenc*g; n.z = 1-f/2; return n; }6.Stereographic Projection
half4 encode (half3 n) { half scale = 1.7777; half2 enc = n.xy / (n.z+1); enc /= scale; enc = enc*0.5+0.5; return half4(enc,0,0); }
half3 decode (half4 enc) { half scale = 1.7777; half3 nn = enc.xyz*half3(2*scale,2*scale,0) + half3(-scale,-scale,1); half g = 2.0 / dot(nn.xyz,nn.xyz); half3 n; n.xy = g*nn.xy; n.z = g-1; return n; }8. Per-pixel View Space
float3x3 make_view_mat (float3 view) { view = normalize(view); float3 x,y,z; z = -view; x = normalize (float3(z.z, 0, -z.x)); y = cross (z,x); return float3x3 (x,y,z); } half4 encode (half3 n, float3 view) { return half4(mul (make_view_mat(view), n).xy*0.5+0.5,0,0); } half3 decode (half4 enc, float3 view) { half3 n; n.xy = enc*2-1; n.z = sqrt(1+dot(n.xy,-n.xy)); n = mul(n, make_view_mat(view)); return n; }
https://aras-p.info/texts/CompactNormalStorage.html