在上一篇中介绍了反射:
Jerry:UE4渲染模块概述(四)---反射zhuanlan.zhihu.com同反射一样,光照和阴影在实时渲染中是很难计算的。因此如方法论中介绍的,能预计算的就尽量预计算,能用空间换时间的就尽量换。静态光的光照/阴影都是可以预计算的,动态光则需要实时计算。
本章讨论的是静态光照/静态阴影。静态光是指光源本身不会移动,且不会随游戏进程改变状态。静态光/阴影是在编辑器里预计算的,它们被存储于光图(lightmap)里。
使用光图的优点如下:
(1)不需要运行时计算,节省性能;
缺点如下:
(1)需占用不少内存
(2)预计算的时间较长,每移动一个物件,都需要重新build lightmap
(3)非常大的模型可能会没有足够的空间存储lightmap
这里看上去缺点很多,但都是预计算、以空间换时间必须要付出的代价,只要是运行时性能省下来了,就还是值得的。
lightmap光照贴图本质上就是一张纹理,是一张烘焙有光照和阴影信息的图片,类似于纹理的UV采样,我们也会对存于模型上的光照UV坐标进行采样,将采样结果乘以固有色basecolor得到有光照的渲染效果。图示如下:
![1a797d5eae9f3edbd1f777d73230ef90.png](https://img-blog.csdnimg.cn/img_convert/1a797d5eae9f3edbd1f777d73230ef90.png)
在UE4中,会把许多光照贴图打包到一起,类似于下面:
![c230005ff4c02c8adf2478fe6fad4269.png](https://img-blog.csdnimg.cn/img_convert/c230005ff4c02c8adf2478fe6fad4269.png)
我们可以在worldsetting里面看到这些打包好的光照贴图,但不可修改它们。
我们用LightMass来生成光照贴图,可以配置所需要的贴图精度,分散在两个地方:
(1)build光选项里面的光照质量,如preview,high,productive
(2)worldsetting里面的lightmass选项,如下图:
![e60691669efabb8e1f9d804f6329adfa.png](https://img-blog.csdnimg.cn/img_convert/e60691669efabb8e1f9d804f6329adfa.png)
对于一些想要高精度lightmap的地方,可以放置一个光照重要性体积(light importance volume),UE确保体积内的任何东西都有更高质量的光照 (如战斗区域),而体积外则使用低质量光照(如人物移动不到的远景)。需要注意的是,光图的精度主要影响的内存与文件大小,而不是帧率。
对于光图的制作/烘培过程,我们可以通过下面的方法来提升烘焙速度:
(1) 降低光图分辨率
(2) 减少灯光或场景内物件数量
(3) build时仅使用preview方式
(4)灯光设置较小的衰减半径与光源半径(即使光影响范围小)
在编辑器里,可以查看光图的密度:
![bfbde4bbe574b7c1a355ea93e48c7d6c.png](https://img-blog.csdnimg.cn/img_convert/bfbde4bbe574b7c1a355ea93e48c7d6c.png)
选中后编辑器内的效果如下:
![09b510cdfd0e49605258e21745342920.png](https://img-blog.csdnimg.cn/img_convert/09b510cdfd0e49605258e21745342920.png)
方格越小,颜色就越绿,这表示光照贴图精度越高。对于一些镜头不常看到的地方(如空中的立柱),建议使用低细节度的光照贴图即可。
光图主要是针对直接光生成的光照纹理,对于因多次反射产生的间接光,UE是使用了一种称之为Indirect Light Cache(间接光照缓存)来进行处理。特别是对于移动中的物体(比如说游戏角色),间接光照缓存的光照信息能弥补lightmap的不足。UE4采用了布置采样点方式来生成间接光照缓存,如下图所示:
![1e4e32356b0a565aed9758d5333ce7fa.png](https://img-blog.csdnimg.cn/img_convert/1e4e32356b0a565aed9758d5333ce7fa.png)
灰白色的点即为采样点,对于任何物体,都会找到离它最近的采样点,查询到它的亮度信息,然后将采样结果与物体自身颜色进行混合。可以选中物件,在下图位置找到间接光的配置项:
![0505286f479b910ad0024bfbdcc331a5.png](https://img-blog.csdnimg.cn/img_convert/0505286f479b910ad0024bfbdcc331a5.png)
下拉菜单有三项可选:不使用采样点,使用采样点,使用采样体积。使用采样体积是指选用更多的采样点,比如周围5*5*5个点来计算间接光照。
间接光照缓存是在build lightmap同时做的,采样点会在lightmass importance volume范围内生成,可能会超出一点点。需要注意的是,采样点不是等密度的,一般来说地面的采样点多于空中的采样点,如果想要在空中也有较高密度的采样点,可以创建一个Lightmass Character Indirect Detail Volume(Lightmass角色间接细节体积),如下:
![74aeed57026e220e7ecc2230a81854b3.png](https://img-blog.csdnimg.cn/img_convert/74aeed57026e220e7ecc2230a81854b3.png)
在worldsetting这里可以配置采样点的生成密度:
![7841d289e0d00d4fe6dc4983ff7815d1.png](https://img-blog.csdnimg.cn/img_convert/7841d289e0d00d4fe6dc4983ff7815d1.png)
配置好就可以在空间也获得比较好的间接光质量了,如下图:
![b0f1ff363ee66b99cf01231d850f4dc7.png](https://img-blog.csdnimg.cn/img_convert/b0f1ff363ee66b99cf01231d850f4dc7.png)
关于静态光的lightmap与Indirect lighting cache就介绍到这里,下一部分会介绍动态光照:
Jerry:UE4渲染模块概述(六)---动态光照zhuanlan.zhihu.com