分享

Unity的光照与渲染 (十二)Mixed Lighting

 tiancaiwrk 2020-03-13

Shadowmask模式

    Shadowmask模式又分为了ShadowmaskDistance Shadowmask

    Shadowmask这个模式下与substractive模式下最大的不同是,直接光并没有烘焙进光照贴图,而是使用两张光照贴图分分别记录了光照的亮度以及方向,仅仅记录了光的信息而不是所有的直接光照的最终效果。然后它使用了一张RGBA四个通道的贴图,用于记录Mixed Light在静态物体之间投射的阴影。这里说是记录阴影并不准确,其实是记录的就如模式名字的字面意思,阴影遮罩,每一个使用阴影的Mixed Light都使用其中一个通道记,按照Lightmap的UV和分辨率,记录了其灯光的影响范围(其他地方对于这盏灯光就是阴影部分了)。由于贴图只有4个通道(RGBA),对于同一个位置,只能记录4个Mixed Light的影响(光照探针同样之记录最多4个Mixed Light),多于这个数量就会将其中某个灯光当做Baked Light处理,同时Unity在Scene窗口的绘制模式中提供了Shadowmask模式以便观察这个阴影遮罩,以及Light Overlap模式以便检查某一区域是否有超过5个Mixed的灯光。

Shadowmask绘制模式
使用Light Overlap绘制模式为同一区域超过4个带有阴影的Mixed Light的情况查错

    这样的处理,我们相当于可以从Shadowmask中获取静态物体的遮挡关系,动态物体则有实时计算的Shadow map,通过而综合这些遮挡关系从而处理最后的阴影叠加就能获得正确的Mixed Light的阴影效果。

    总结下来,静态物体之间的阴影由Shadowmask贴图提供,动态物体产生的阴影将读取实时计算的Shadowmap,而静态物体投射到动态物体上的阴影则由光照探针(Light Probes)提供。

    这个模式下,用一个简单的示例展示几个点:

左:设置的参数以及Shadowmask 右:除小球外均设置为静态,采用mixed的点光源

第一:静态物体阴影的分辨率将由Lightmap Resolution参数决定,动态物体阴影则受Quality页面下的阴影参数影响,为了获得更好的阴影可能需要提升光照贴图分辨率。对比如下:

静态阴影质量分辨率较低
提升静态阴影质量,降低动态阴影质量

第二:静态物体阴影完全由Shadowmask计算得来。尽管直接光照是实时光,但是移动会出现较大问题:

感受Shadowmask的作用

那么颜色更改呢?

    注意到最后留下的间接光部分,Mixed Light的间接光在静态物体上是完全烘焙的,间接光是无法对应修改后的结果的。

第三:上述图片中没有添加光照探针,动态物体将不会接收静态物体的阴影,也没有任何间接光效果,因此实际应用中需要正确设置光照探针以确保效果。

    这个模式的优势在于,首先,解决了我们的头等问题,动、静态物体阴影的正确混合,同时为静态渲染物体提供高光渲染;由于静态物体不需要实时渲染Shadow map,如果只有少量动态物体,性能开销对于中低端移动设备完全可以接受。

    缺点是静态物体投射到动态物体上的阴影分辨率很低(它是由光照探针提供的,可以自行试验感受);同一个区域最多只能有4个Mixed的光源叠加(贴图通道限制)。使用内存会比以前多(光照贴图有所变化以及增加了Shadowmask贴图)。

    Distance Shadowmask原理其实和Shadowmask基本相同,同样只支持4个Mixed Light的重叠,它主要解决了静态物体阴影分辨率的问题(无论是投射到静态物体还是动态物体上),因为,这个模式下面Unity同时将实时渲染静态物体的Shadow map,也就是说,所有物体的阴影都是实时计算的,如下图所示:

动态物体上的阴影,以及静态物体阴影都将由Shadow map提供

    那么问题来了,这就是实时阴影啊,Shadowmask哪儿去了?这个模式之所以叫Distance Shadowmask,就是因为,它会实时判断物体和镜头的距离。我们知道Quality设置中Shadow Distance决定动态物体阴影的显示距离,此时它也会同时参与静态物体阴影的显示计算,超过该距离,则使用之前的Shadowmask显示阴影,静态物体之间阴影由Shadowmask提供,静态物体到动态物体的阴影则由光照探针Light Probes提供(动态物体的阴影?当然没有了啊,都超出设置的Shadow Distance了)。

    既然是实时阴影,那么灯光能够移动,改变颜色么?仍然是同样的问题,毕竟是baked模式下间接光是完全烘焙的,一旦改变Mixed Light的颜色和位置,间接光的计算就是不对的。对于超出了Shadow Distance的物体,移动光源(尤其是影响整个场景的平行光),阴影就会出现和Shadowmask下同样的问题。

    这种模式下所有贴图都和之前那种一样,甚至两种模式可以实时转换,这也就是为什么Unity2017将两个模式合并为一个,并且将具体选择放在了Quality设置下面(游戏中也可以将这个选择作为参数放到画面设置中)。

    那么Distance Shadowmask的优缺点也就很明显了,阴影质量非常高,但是代价是性能消耗的提升(毕竟所有物体都参与了实时Shadow map的计算,增加Drawcall),一般在主机或者较高性能的PC上使用。

    以上两个模式综合起来,也就是我们真正的Shadowmask模式(竟然和子选项名字一样,真的不用区分下么,搞的头很大呀)下,我们真正意义上解决了混合灯光阴影混合的问题,也给出了中低性能和较高性能的不同解决,以便我们在条件允许是能选择更好的阴影质量。

Baked Indirect

    在了解了上面的几种模式后,Baked Indirect模式就非常好理解了,在Shadow Distance范围内所有阴影都实时计算,也就是说,仅仅烘焙间接光照(名字就是这么取得)。它不用渲染Shadowmask贴图,也就是说叠加的混合灯光没有任何限制,也节省了相应的内存空间。但是超出阴影范围后,所有阴影都不渲染了,当然这个问题可以使用后处理的雾效来掩盖远距离没有阴影的缺陷。或者是室内场景,周围都是遮蔽物的环境,这些场景中我们就看不到那么远距离了。该模式的使用定位一般是中端PC或者高端移动设备。

Mixed Lighting模式小结

    几种混合模式的共同点是,都烘焙了间接光(要不怎么叫Baked GI)。间接光,如我们之前所介绍的,非常柔和,自身变化并不大。如果我们的Mixed Light仅仅发生一些小的改变,其实间接光发生的变化也很小,甚至可以忽略不计。也就是说,Mixed Light还能有下面这种操作:

是不是很像实时光了

    截取去年Unite欧洲的PPT,当做这几个模式简单总结

    Unity5.5及其之前版本,Baked GI配合Baked Lights,加上Direction Specular模式,可以创建一个完全静态烘焙的基于物理渲染(PBR)的场景,这种场景的直接光照也是烘焙的,也就不仅仅是Baked GI了,但是对于游戏中一定会出现的动态物体,却没有好的解决办法。经过Unity5.6完善之后,我们就有了如下选择:

  • Realtime Lights 和 PRGI 提供全实时光照方案

  • Baked Lights 和 Baked GI 提供全烘焙光照方案(没有动态物体)

  • Mixed Lights 和 Baked GI 提供拥有动态物体的烘焙GI的方案

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多