这种烘焙模式,只烘焙间接光。
烘焙结果:
shadowmask模式+shadowmask Mode=Shadowmask:
烘焙间接光,但是多了一个shadowmask
shadowmask模式+shadowmask Mode=distance shadowmask:
烘焙结果无变化,但是,打开帧调试器看到:
这里要注意,这里我选择的是no cascades,所以只会出现一次绘制,如果是two cascases或者four cascades,则可能在shadowmap阶段绘制多次。
不管怎样,在shadow distance=50的时候,5个物体都是参与了实时的绘制,也就是使用了shadowmap。
当调整shadow distance=10的时候,那么在shadowmap阶段少了一个绘制物体,Draw Mesh Cylinder (1)
也就是说,随着shadow distance的缩小,有些物体,不参与shadowmap的绘制,而直接使用了shadowmask。
具体在看:Draw Mesh Cylinder(1)的shader关键字:
此时只打开了这几个关键字:
Standard, SubShader #0
DIRECTIONAL LIGHTMAP_ON SHADOWS_SHADOWMASK
也即是使用了SHADOWS_SHADOWMASK
而如果改为shadow distance=50,那么会有什么变化呢?
注意此时,打开多了一个关键字
Standard, SubShader #0
DIRECTIONAL LIGHTMAP_ON SHADOWS_SCREEN SHADOWS_SHADOWMASK
也即是使用了unity的屏幕空间阴影,也就是上面的shadowmap阶段中,绘制的深度图,然后再blit的屏幕,也就是实时绘制阴影了+shadowmask的两者的融合。
我们再看看,如果只使用
shadowmask模式+shadowmask Mode=Shadowmask:
此时帧调试器的状态,应该为没有shadowmap阶段,全是使用shadowmask才对。
果然,shadowmap阶段都没了。
所以distance shadowmask,相较于shadowmask会效率低一下。但是可以在distance之内获得实时绘制阴影的效果。
我们在看看阴影质量:
可以当在distance=50的时候,由于使用了shadowmap+shadowmask,阴影更加的柔和。
而如果是distance=10的时候,则阴影会有点坚硬。
而如果是distance=0,相当于是直接使用shadowmask,阴影也相对柔和,但是依然没有shadowmap+shadowmask软。
ok我们知道了,在使用distance shadowmask的时候,在小于distance的时候,使用shadowmap+shadowmask的融合,这样就会有个问题:
如果我们调整了光源的方向,会出现叠影:
如上图,只有黄色的将头的物体,没有出现谍影,为啥呢?因为其是使用的全是shadowmask,所以不会有叠影。
而其他的物体,都是shadowmap+shadowmask,而此时shadowmap已经是在光源方向改变的情况下,所以融合的有点问题。
所以这种情况下,最好是光源的方向不要变化。否则会有问题。
最后是subtractive模式:
此时是将直接光+间接光+阴影都烘焙到光照贴图上了。无shadowmask
所以会更加亮一下。此时帧调试器的情况,无shadowmap阶段:
但是打开了宏:
Standard, SubShader #0
DIRECTIONAL LIGHTMAP_ON LIGHTMAP_SHADOW_MIXING
此时灯光,改变方向与否已经无法影响静态物体的阴影了。因为全部是使用静态的烘焙的图了。
总结:
1、此篇博客,主要总结了使用mixed灯光的烘焙,分布有:
baked indirect——只烘焙间接光,直接光实时计算,阴影实时计算
distance shadowmask——只烘焙间接光,直接光实时计算,在distance之内(shadowmap+shadowmask融合),distance之外(shadowmask)
shadowmask——只烘焙间接光,直接光实时计算,所有物体都使用shadowmask计算阴影
subtractive——烘焙间接光+直接光+阴影,都是静态,无shadowmask图
2、shadowmask是静态的图,记录的是,每个像素能够被哪盏灯照亮,黑色表示无灯光照亮这个像素。其他颜色,如(1,0,0,0)表示,只受一个灯影响,再比如(1,1,0,0),表示受两个灯影响。一个像素最多收到四个灯影响,多于四个灯影响,unity将其不重要的灯,使用baked模式处理。
3、shadowmap是动态,是参与实时计算的,是参与深度图绘制的,是参与到灯光空间深度绘制的,这些都是一个意思。
4、烘焙质量的选择,如果只使用间接光光照,也就是只需要记录间接光,那么则可以选择baked indirect模式,distance shadowmask,或者shadowmask,都可以,因为我们的颜色图,都记录的只是间接光颜色。而subtractive为啥不行呢,因为其颜色图记录了直接光+间接光+阴影,所以不行。
而此时对于阴影,我们一般是自己写实时的阴影,也不会用unity自己的阴影,因为unity模式是使用屏幕空间阴影,三次全场景的绘制不说,还用了3个rt,占用内存。所以一般是自己处理物体的阴影,处理的方案,我这里顺便说下:
首先,区分动态物体、静态物体、自阴影
动态物体,是场景中能够移动的物体,如角色,怪物等等。草和树处理暂时不知道,草应该不会释放阴影,不参与阴影的计算,树呢?树应该当做静态物件处理。
静态物体,是场景中的物体,不如建筑物,篱笆,等,这些物体的阴影可以在出现在人的视野的时候,进行绘制阴影,使用rt策略,其实也就实时绘制,不过要做好缓存机制,不要每帧都绘制,只在物件出现在视野的时候才绘制rt深度。
自阴影,一般是主角上,并且是在展示界面,而不会全场景的角色,或者身边几个角色支持自阴影也可以,但总之也是会有一个rt的内存耗用,还有增加多个drawcall。
总之,如果抛弃了unity的阴影,那么所有的阴影(动态物体、静态物体、自阴影)都得自己搞,策略都是自己定。
ok,大致就这些,关于烘焙还有好多的细节,包括参数的调整,2号uv的问题,接缝的问题,分辨率的问题,烘焙时间的问题,以及scale in lightmap的问题,等等,后面再学习,再补充。