文章目录
- 前言
- 一、Lambert漫反射计算1
- 1、MixRealtimeAndBakedGI 函数有三个重载
- 2、3号 调用了 2号
- 3、1号调用了 SubtractDirectMainLightFromLightmap函数
- 4、我们重点来看 Lambert漫反射的实现部分
- 5、其余部分
- 二、Lambert漫反射计算2
- 1、LightingLambert
前言
在之前的文章中,我们已经知道了 SimpleLit 下的主光数据怎么获取。
- Unity中URP下获取主灯信息
- Unity中ShaderGraph下获取主灯
有了这些数据,我们就可以计算 Lambert漫反射 和 BulinnPhone高光反射 了。
一、Lambert漫反射计算1
- 我们在获取了主光信息后
Light mainLight = GetMainLight1(inputData, shadowMask, aoFactor);
- 就来到了 Lambert 漫反射的计算(这里同时包含了实时光照 和 全局光照GI的计算)
MixRealtimeAndBakedGI(mainLight, inputData.normalWS, inputData.bakedGI, aoFactor);
- 我们来分析一下 MixRealtimeAndBakedGI 函数
1、MixRealtimeAndBakedGI 函数有三个重载
- 我们这里为了方便称呼,把他们分别称为 1号、2号、3号重载
- 调用时,我们首先调用了 3号
2、3号 调用了 2号
3、1号调用了 SubtractDirectMainLightFromLightmap函数
- 该函数就是实现了 Lambert漫反射计算的核心部分 同时混合了 GI
4、我们重点来看 Lambert漫反射的实现部分
- 得到 d o t ( N ⃗ , L ⃗ ) dot(\vec{N},\vec{L}) dot(N,L),并且限制范围在[0,1]之间
half contributionTerm = saturate(dot(mainLight.direction, normalWS));
- 然后,用计算出的漫反射结果 与 主光颜色混合,就得到了最终的漫反射颜色
half3 lambert = mainLight.color * contributionTerm;
5、其余部分
- GI相关
- 阴影相关
二、Lambert漫反射计算2
- 在 CalculateBlinnPhong 函数中,也有计算 Lambert 光照的部分
- CalculateBlinnPhong 调用了 LightingLambert函数来计算Lambert漫反射
1、LightingLambert
- 其中主要进行了两步
- 得到 d o t ( N ⃗ , L ⃗ ) dot(\vec{N},\vec{L}) dot(N,L),并且限制范围在 [0,1]之间
half NdotL = saturate(dot(normal, lightDir));
- 混合 主光颜色 和 点积结果
return lightColor * NdotL;