现在的项目是个PC的Unity项目,一下子从手游的运行时50 draw call变成动辄5K draw call,还真有点不适应。既然性能放开了,那么就要有相应的效果匹配,所以开了N个灯光进行对大场景的照射。一个材质的draw call数在shader只绘制一次的情况下就会变成 N次draw call调用。尽管是强劲的PC也出现了卡顿的现象,那么就进行了光的烘焙,记录一下Unity烘焙的要点吧。
- 导入的模型都要在属性窗口中Model的 Generate Lightmap UVs勾选上,这是让lightmap匹配你的UV。如果你UV展得不均匀,那么得到的烘焙阴影效果也不会好。
- 分好场景中GameObject的层,灯光和烘焙照射时可以分得开。例如UI就放到UI层,人物等活动的就放到活动的层,不动的建筑放到建筑层等。
- 把要烘焙的物体设置为static。
- direct光设置一个主的,实时光照,其他的光都设置为baked的,注意室内点光源也是这样。baked的灯光根据实际情况选择是否开启阴影。光线可以对某些层的物体不进行照射。
- 记住灯光的设置中Render Mode要选择Important,如果不选,某些多灯光的位置会有闪烁的问题。烘焙的效果也是按important计算的,如果你发现烘焙后曝光,就是因为没有选中这个,才导致效果跟你现在的不一致。选中后如果曝光,说明你灯光的Intensity设置得过高了。
- unity中抗锯齿和图像效果(例如bloom等)二者只能选其一,很多显卡也是这样(但较新的ATI的某些显卡都已经支持可以都开启了,目前的unity版本还不行)。那么根据项目的严肃情况,这里还是选择保留了抗锯齿。
- 项目的player setting中的 Color Space根据效果选择了 Gamma。
- 场景内几乎大部分的物体的shader,一般都用Unity5的stand了。很多都配置了normal map,unity可以自动制作normal图,很不错。灯光多的时候,有normal图的材质感还是很不错的。反光度也需要根据材质调节一下。
- Edit->Project Settings->Quality,看情况设置一下像素灯光数,可以适当增大,垂直同步在不追求实时性的时候一般就关了吧。
- 打开window->Lighting点击Scene,如果有天空盒子的拖现在的天空盒子,如果不需要实时GI的把Precomputed Realtime GI勾掉。根据项目限制的大小,设置一下Atlas Size一般1024或512的。1024的烘焙的速度会慢很多。点下Build按钮,经过很慢的过程后就有烘焙效果了。中途切场景的话烘焙工作也会停止,切回来再点可以继续。
- 如果出现了'Compositing' job failed with error code: 3 ('Failed reading Direct file.').这样的烘焙错误,清空一下渲染出来的图,勾上realtime GI,烘一下,就关闭,再勾掉,勾上BakedGUI烘焙就好了。
- 烘焙中OA的参数最好还是设置一下,效果不错。(就是 Lighting-》Scene-》Baked GI-》Ambient Occlution)
- 尽量不要室内室外都制作在一个场景里,灯光会相互干预,例如,你屋外的平行光的阴影硬度设置得很高,光强设置得很高,那么即时你屋内的灯再亮,看上去也是漆黑一片,不过可以用逻辑动态调整一下(人在屋内就减弱屋外的灯光)。
- 好的效果还是要靠光线、shader、和烘焙出来的反射效果,你需要一台渲染工作站来加快烘焙速度。
- 对了,还有一个点,在烘焙的时候会产生很多临时文件,在Edit->Preferences->GiCache中设置临时文件的位置和大小,如果设置得太小,存不下的时候会报错的。
Playersetting中的RenderingPath还是选择Forward吧,为了享受抗锯齿效果和透明贴图,上述的几点也是针对Forward来进行的设置,对于这个项目一个实时方向光用来产生动态阴影差不多够了。其他的使用烘焙出来的阴影。
在后续的烘焙中为了保持金属的反光和没反光没UV的管线正常显示,整理了一个方案,拿图片记录一下。