Unity URP Shader之高级光照技术之SH
SH,英文全称Spherical Harmonics Lighting,即球谐光照,主要用来模拟漫反射。
1. 如何计算SH
SH只需要提供一组Vector4数组,便能通过算法来计算出漫反射光,这种方法的好处是适用于没有光照探针的场景中。如计算方法如下:
1 half3 CalcSH(float3 normal_dir, half4 custom_SHAr, half4 custom_SHAg, half4 custom_SHAb, half4 custom_SHBr, half4 custom_SHBg, half4 custom_SHBb, half4 custom_SHC) 2 { 3 float4 normalForSH = float4(normal_dir, 1.0); 4 //SHEvalLinearL0L1 5 half3 x; 6 x.r = dot(custom_SHAr, normalForSH); 7 x.g = dot(custom_SHAg, normalForSH); 8 x.b = dot(custom_SHAb, normalForSH); 9 10 //SHEvalLinearL2 11 half3 x1, x2; 12 // 4 of the quadratic (L2) polynomials 13 half4 vB = normalForSH.xyzz * normalForSH.yzzx; 14 x1.r = dot(custom_SHBr, vB); 15 x1.g = dot(custom_SHBg, vB); 16 x1.b = dot(custom_SHBb, vB); 17 18 // Final (5th) quadratic (L2) polynomial 19 half vC = normalForSH.x*normalForSH.x - normalForSH.y*normalForSH.y; 20 x2 = custom_SHC.rgb * vC; 21 22 float3 sh = max(float3(0.0, 0.0, 0.0), (x + x1 + x2)); 23 sh = pow(sh, 1.0 / 2.2); 24 return sh; 25 }
这一组Vector4数组如下:
2. 光照探针
unity中提供了Light Probe,即光照探针,来提前把光照信息烘焙到探针球里,这样物体进入探针区域后,通过取出影响物体的所有探针球,来计算出SH光照。
这是一种比较节省性能的做法。shader中计算SH光照可调用方法 half3 SampleSH(half3 worldNormal);
效果如下: