Unity5.x场景优化之动态设置光照贴图lightmap

在很多情况下,我们为了提高渲染效率,一般都会让美术同学在制作场景时,设置场景相关节点的lightmap static属性,提前给整个场景烘培出静态的光照贴图lightmap,烘培的数据保存在场景目录下的LightmapSnapshot文件中,主要包括的数据有:

lightmaps:烘培出的光照贴图数组;

gameobject uid:被烘培的gameobject的唯一标识;

renderer的lightmapIndex:被烘培的gameobject的renderer组件所指向的光照贴图数组的索引;

renderer的lightmapScaleOffset:被烘培的gameobject的renderer组件所指向的光照贴图用于采样的区域坐标和宽高;

这个文件目前没有相关api读写,如果你想烘培完场景之后,把场景里面的gameobjet抽出来做成prefab,等切换完场景之后再用于动态加载是不可行的,因为抽出来的prefab在Instantiate之后将会是一个新的gameobject,uid自然和LightmapSnapshot文件里面记录的不一样,导致找不到对应的光照数据而造成模型没光照变暗或渲染错乱。

还有一种比较常见的需求是,在游戏运行时,通过更换光照贴图数据,营造场景在不同时间或季节的光照氛围,例如白天和黑夜等。

so,就算场景烘培完之后,我们还是要“动”它。

做法大概是,既然LightmapSnapshot文件我们不能动,那就把上面提到的光照数据保存到我们可以控制的文件里面,例如prefab。

首先,给场景根节点挂一个自定义组件,用于保存烘培出的光照贴图数组和烘培模式:

再给场景里面被烘培的gameobject挂一组件,用于保存光照贴图数组的索引和光照贴图的区域坐标和宽高数据:

如果手动挂上面两个脚本的话,繁琐且容易出错,so,写工具接口,用工具扫场景挂脚本:

没截图从觉得少点什么,来,上图,先打开一个被烘培过的场景,场景根节点为scene_root,被烘培的gameobjet是地板、一颗小草、带logo的立方体:


然后使用工具给场景里面的相关节点挂脚本存数据:


把场景根节点scene_root拖出来做成prefab,然后删掉场景里面的scene_root,再把scene_root.prefab拖进场景里面:


此时模型是丢失了光照数据的,原因截图已说明。接着运行场景:


模型的光照又回来啦,原因截图已说明。

猜你喜欢

转载自blog.csdn.net/yuyingwin/article/details/80105664