这两天在做一个树林的效果的练习,做完效果后用Lightmap做资源优化的过程中遇到了一些问题,在这里记录一下。
在做完颜色差异化、背光次表面着色、树叶体积感渲染后,发现资源消耗比较大。用一棵树的模型复制、旋转、缩放形成100棵树的树林,在渲染时面数为104.4k、顶点数为159.3k、Shadow Casters为191、Batches为396。
加入光照贴图
然后就想到了可以用光照贴图来代替实时的光照计算来减少资源消耗。按照光照贴图的设置:
- 树和地面标记为Static
- 灯光的Light Mode选为Baked
- Lighting选项卡中勾选Baked Global Illumination
LightMapper使用渐进式的Progressive GPU来进行烘焙。烘焙完成后运行场景,资源消耗确实是真的小
但是场景的渲染结果却出现了问题
可以很明显的看出来总共是两个问题:
- 树的着色渲染完全错误
- 树的影子变成了块状
树的颜色差异化渲染完全没有了,而且移动摄像机也发现着色渲染也完全是错的,树的影子在边缘还是可以的,但是在中间和靠近光源这边影子就完全消失了。那接下来就挨个解决这两个问题:
树的着色
这个问题其实比较简单,简单分析一下然后进行测试就能发现问题,同材质的物体标记Static会被进行静态合批,合批之后就会变成一个mesh,然后使用同一个材质同一个shader进行着色渲染,我这里树的颜色差异化是根据位置来计算的,合成一个Mesh后这个计算就会没有差异。
而且如果树都用光照贴图进行光照渲染的话,这片树林需要的贴图数量也会是一个很大的量,这个内存和资源的消耗也要比直接使用实时光照的开销要大的多,所以取消使用Lightmap对树本身进行光照计算。
所以树的Static需要选择为Contribute GI,只有在烘焙Lightmap的时候才是静态的物体,然后树不能使用Lightmap的光照,还是需要实时的光照进行渲染,所以树物体的Receive Global Illumination需要选择为Light Probes。
影子
影子的问题就比较难搞了,调整Lightmap