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);

 

效果如下:

 

 

转载请注明出处:https://www.cnblogs.com/jietian331/p/17027769.html

posted @ 2023-01-05 15:40  孤独の巡礼  阅读(905)  评论(0编辑  收藏  举报