在项目中,常常因为效率与显示效果的多方面考虑,来选择是使用lightmap 还是 动态光照。在页游和微端游戏中,还要考虑游戏资源包的大小。

使用lightmap,在渲染的时候由于pix shader计算量的减小,会带来性能上的提升,直接的表现就是帧速的提高。但是,显示效果上面,显然不如动态光照来的精细和真实。LightMap也可以做到很漂亮,但是带来的结果就是LightMap文件的大小,也许会高到10M+的尺寸。这就造成前面说的,下载量的增加。对于3D页游和微端来说,是很不合理的,这意味着,如果要进入一个场景,光照图就需要下载10M,在中国的网速环境下,必然造成部分用户流失。

动态光照可以减少下载量,提高渲染质量,带来的就是帧数的下降。如果不使用延迟渲染的话,场景中灯光越多,帧数掉的越快。

怎么找到一个平衡?

由此想到一个解决方案,根据用户配置,决定,使用动态光照还是Lightmap。

1. 需要做的是,在unity编辑器中,烘培lightmap。烘培后,把lightmap从场景文件夹中移开(是在文件夹中操作,不是在unity 的LightMap面板中点击clear button ,那我烘培它干啥)。放到其他指定文件夹下。比如“Assets/lightmap/scenenXXX/  ”。当然也可以不移除,移除是为了不把light map和场景一起打包,这样可以实现,lightmap与场景分开下载。减少第一次进场景的下载量。

2.虽然把lightmap移走了,但是在Unity的Scane中,还是记得有哪些GameObject使用了lightmap的。只是在游戏渲染中,渲染每个接收lightmap的物体的时候,去采样lightmap的时候,找不到数据。因为light已经被移出默认文件夹,就不能顺利的加载至内存,上传到显存。

3.如果是使用动态光照,在进入场景后,调用一个脚本,该脚本只做一件事情,就是把所有场景中用到MeshRender组件中的lightmapIndex的值赋值为-1,这个lightmapIndex是指该gameobject是使用lightmap中的哪一张。所以如果这lightmapIndex有大于等于0的值的时候,如果场景中的LightMap不存在,会出现显示上的Bug。