5.6混合光照

Posted by 蔡华的博客 on July 9, 2017

原文地址

原有混合光照的问题

  • 5.6之前的光照存在一个严重的问题就是: 混合光照仅当只有一个定向光时才能正常工作。
  • 这是什么个意思呢?
    • 首先说一下unity的GI一直以来都是依靠烘焙来做的,但是在unity5中加入了PRGI。
    • 目前的unity在一个场景中可以混合使用烘焙光照和实时光照,一部分静态对象使用烘焙好的光照和影子,而一些非静态的对象可以继续接受实时光照的影响。这个需要我们把Light Type设置为Mixed。
    • 不过静态对象会既受烘焙的影响又受实时光的影响,从而产生不好的效果。mixed模式就是为了解决这个问题而出现的,理想情况下,混合模式会为你料理好一切,照亮相同平衡范围内的动、静态对象(从而保留了视觉逼真度与一致性)。只是一切都不是那么的美好,事实上是动态物体不会从spotlight上产生阴影。
    • 需要特别声明一下,我自己的测试中完全没有发现上面的问题,目前不知道原因。

5.6引入的混合光照模式

Subtractive

  • 这个就是以前的混合方式。

Shadowmask

在Shadowmask模式中,静态对象通过shadowmask从其他静态对象接收阴影,不必考虑阴影距离。来自动态对象的阴影仅能通过阴影距离内的阴影贴图获得。动态对象通过阴影距离内的阴影贴图接受来自其他动态对象的阴影。来自静态对象的阴影仅能通过光照探针获得。

  • 这段读着有点绕口,其实分析起来就是针对静态和动态物体获得阴影进行了区分。相对来说静态物体获取阴影会比较简单(至少我认为是)。而动态物理为了得到静态物体的阴影需要使用光照探针。而文中的阴影距离内的阴影贴图这个推测是阴影图,熟悉unity shader中阴影产生的人应该知道这个东西。

Distance Shadowmask

Distance Shadowmask的行为是由阴影距离决定的。在阴影距离内,动、静态对象都会渲染进阴影贴图,静态对象可以在动态对象上投射锐阴影。超出阴影距离,静态对象会通过预计算shadowmask接收来自其他静态对象的高质量阴影,而动态对象则通过光照探针与LPPV,接收来自静态对象的低分辨率阴影。 普通的Shadowmask模式要比Distance Shadowmask模式产生更少的Draw Call,因为阴影贴图的性能消耗要高于烘焙阴影(因为它们在每帧都进行渲染,而烘焙阴影是保存在一个纹理/光照贴图中的)。

  • 这个就有意思了,根据阴影距离决定对象是否渲染金阴影贴图(这里的阴影贴图应该就是阴影映射纹理,它是通过ShadowCaster这个pass产生的),动态和静态的对象满足条件时都会参与渲染,所以会有性能消耗。因为每个对象的都要执行一次pass,而这个pass造成了draw call。(这个不是很能理解了,为何不是在一次DC中执行这个pass?)

  • Distance Shadowmask模式更适合高端PC或游戏主机。而Shadowmask则作为一种更廉价的解决方案,推荐在中低端设备使用。

Baked Indirect

Baked Indirect没有使用任何Shadowmask。所以在这个模式中没有远距离阴影。在阴影距离之内,所有静态和动态的对象都投射 实时阴影贴图。但超出阴影距离后,就没有阴影。在Baked Indirect中,除了间接照明之外所有的东西都是实时的。这意味着,实时光照、实时阴影以及实时镜面高光,但是反弹的光照信息储存在光照贴图中,是静态的。

  • 这个东西和shadowmask的区别在于超出阴影距离后就没有阴影了。还有非间接照明是实时的难道说明烘焙出来的静态物体在直线光下其实和没烘焙一样?只有间接光是在lightmap中。

总结一下:

  • 5.6可以说是unity在渲染上又迈进了一步。处理更加精细的影子效果外,还加入了简单的后处理流程,让开发者能够更简单的做出优美的画面。
  • 本文只是对官方内容的简单的总结,在实际使用中不同的硬件环境应该有不同的选择。
  • 文中的各种不同的选项对应的物体的影子的互相影响需要参考Reference card for Light Modes

如何烘焙

  • 主要光的baking是baked,静态物体勾选哪里Lightmap Static。点击bake进行烘焙。