说是Lightmap Generation,其实更多的是direct lighting,具体可参考Lightmap Generation;
传统的lightmap生成是通过每像素Tracing大量的射线,在场景中进行弹射,最后累积每根光线的在lightmap的贡献;这种方法在GPU上很难实现,除非是很小的场景,或者易于参数化表示的场景;主要还是场景信息很难在GPU上表达,并且很难在GPU上对大场景进行高效的Tracing;
然而,如果lightmap只需要记录一次弹射的光照,光栅化就可以被充分用来进行加速;并不是都每条光线(即每个个像素)去选择随机的方向进行发射,而是随机选择一个方向,然后每条光线(即每个像素)都沿这个方向进行光照计算;两种方法都可以得到同样的光照结果,但是第二种方法可以直接利用光栅化求得,对硬件更加友好;通过多次光栅化结果的平均,就可以收敛到最终稳定的结果;
虽说此方法只能计算直接光照,但是用此方法来计算光照是非常不划算的,因为本来直接光照就可以在光栅化里直接计算;该方法性价比较高的地方在于,可以计算可见性,也就是我们常说的Shadow;对于球面光源和面光源,各顶点的阴影是很难实时计算的,采用本方法就可求得面光源的软阴影,以及环境光的软阴影(AO);
结果如下图所示: