![26244e4ed5fa33e2f57e5aa43c77a4dc.png](https://img-blog.csdnimg.cn/img_convert/26244e4ed5fa33e2f57e5aa43c77a4dc.png)
接下来我们来讨论GI的漫反射部分, 首先需要明确的是, 这里的漫反射GI, 指的是最后一步是漫反射, 而不关心前面的光传播是漫反射还是镜面反射.
光照预计算
和前面我们烘焙AO系数的过程一样, 最简单的方式就是将漫反射的光照预计算并保存下来, 当然, 这种方式仅仅适用于静态的物体和静态的光照. 另外, 这里的烘焙是可以包含前面我们讲的环境光照的.
一般来说, 我们通常需要将场景中的物体分为静态(static)和动态(dynamic)的, 对于静态物体使用烘焙的技术. 而对于动态的物体, 会在下面讲到如何实现GI效果.
最简单形式的烘焙就是直接记录静态光照在物体表面上的 irradiance, 对于一个平坦 lambertian 平面, 实时计算光照的过程非常简单, 只需要用 irradiance 乘以物体表面的albedo即可:
![994f84d9801dd2a62bbaf080a1fad330.png](https://img-blog.csdnimg.cn/img_convert/994f84d9801dd2a62bbaf080a1fad330.png)
当然这里我们是假设物体表面是平坦的, 对于有法线贴图的物体, 这种方式就会出现明显的穿帮. 因此目前已很少见到预计算 Irradiance的做法.
你可能觉得困惑的一点是, 为什么不将物体表面的漫反射光照直接计算出来并保存呢, 因为漫反射Lambertian假设在所有方向上观察强度完全相同, 这样根本就不需要考虑法线的问题了.
原因是这样做会消耗非常大的存储空间. albedo 贴图本身是非常 high-frequency 的, 而且 albedo 贴图是可以在多个模型间复用. 但是 lightmap 无法复用, 只能做成 low-frequency 的. 这样将 lightmap 和 albedo 分离可以尽量降低内存消耗.
带方向光照预计算
因此, 我们烘焙的 lightmap 需要考虑不同法线情况下对应的光照信息. 幸运的是, 我们手头有很多现成的工具. 在本系列文章第一篇中讲环境光照的时候, 讲到过球形高斯SG和球谐函数SH, 正好可以在这里使用.