如何理解Unity中的MixedLighting

转载自:https://actrpg.wordpress.com/2020/09/28/%E5%A6%82%E4%BD%95%E7%90%86%E8%A7%A3unity%E4%B8%AD%E7%9A%84mixedlighting/

Unity中一共有三种MixedLight模式:Baked Indirect,Shadow Mask, Subtractive,在Lighting -> Mixed Lighting -> Lighting Mode下设置。另外在Shadow Mask模式之下,还有一个Distance Shadow Mask的子模式, 在Project Setting -> Quality -> Shadows -> Shadowmask Mode里设置。这些模式有什么差异呢?官方给出的对比可以归结到一张表格:

我们可以看到,字非常多,简直让人头大,让我无从下手。当我们阅读shader的时候,又会发现好几个宏,其中不同的宏组合在一起表示不同的混合光照模式,让人更加头痛。索性这部分也在shader中有了说明:

我们只需要记住不同的模式烘焙出来的内容是什么,就可以很容易推出上表中的所有结论。

如果我们理解烘焙的产物是什么,那么我们就能知道哪部分是实时、哪部分是预计算、哪部分又需要实时和预计算进行混合(Mix),下面我按这种方式来对三种模式进行一一说明:

Baked Indirect模式:顾名思义,这个模式只烘焙了间接光照。

            静态物体:间接光来自lightmap;直接光和阴影来自实时光源。shadow distance范围外没有阴影。

            动态物体:间接光来自light probe;直接光和阴影来自实时光源。shadow distance范围外没有阴影。

由于阴影都是来自于实时光源,故而LIGHTMAP_SHADOW_MIXING宏不会开启。

因为烘焙lightmap时,没有办法考虑到动态创建的物体,所以动态物体间接光只能来自light probe。

 

Subtractive模式:这个模式将直接光照、间接光照、静态阴影,都打包到了一张lightmap中,故而渲染效率较高(?),但是却带了一些限制。

            静态物体:间接光、直接光、静态物体投射的阴影都来自于lightmap(但是却没有了高光,因为高光是依赖于视角的,无法进行烘焙)。

                             动态物体投射的阴影来自shadowmap(动态阴影)这个阴影与lightmap进行混合,需要从lightmap中减去直接光照、阴影,再与动态物体投射的阴影进行混合,才能得到相对正确的效果,这也是Subtractive的含义)。

           动态物体:直接光来自于实时光源,间接光来自light probe。阴影一部分来自lightmap,一部分来自shadowmap(动态阴影)(二者需要混合所以LIGHTMAP_SHADOW_MIXING宏开启,但无法实现混合,只能通过light probe提供静态物体产生的阴影)。

 

Shadow Mask模式:这个模式烘焙了间接光照、同时也烘焙了一张shadowmask,即静态物体在静态物体上的投影。

           静态物体:直接光来自实时光源,间接光来自lightmap,

                             shadow distance范围内:静态物体投射的阴影来自shadowmask(静态阴影),动态物体投射的阴影来自shadowmap(动态阴影)

                             shadow distance范围外:静态物体投射的阴影来自shadowmask(静态阴影),没有动态物体投射的阴影;

           动态物体:直接光自于实时光源,间接光来自light probe,

                             shadow distance范围内:静态物体投射的阴影来自light probe,动态物体投射的阴影来自shadowmap(动态阴影)

                             shadow distance范围外:静态物体投射的阴影来自light probe,没有动态物体投射的阴影

由于阴影一部分来自shadowmask,一部分来自shadow map,所以LIGHTMAP_SHADOW_MIXING宏开启。同时这个模式自带SHADOWS_SHADOWMASK宏。

 

Distance Shadow Mask模式:

           静态物体:直接光来自实时光源,间接光来自lightmap,

                             shadow distance范围内:静态物体投射的阴影来自shadowmap(动态阴影), 动态物体投射的阴影也来自shadowmap(动态阴影)

                             shadow distance范围外:静态物体投射的阴影来自shadowmask(静态阴影),没有动态物体投射的阴影

           动态物体:直接光自于实时光源,间接光来自light probe,

                             shadow distance范围内:静态物体投射的阴影来自shadowmap(动态阴影), 动态物体投射的阴影也来自shadowmap(动态阴影)

                             shadow distance范围外:静态物体投射的阴影来自light probe,没有动态物体投射的阴影

与Shadow Mask模式比较,区别就在于,在shadow distance范围内的物件,静态物件投射的阴影是否也统一使用实时阴影。这样一来,静态物件也可以投射阴影到动态物体上啦。由于shadow distance范围内统一使用实时阴影,范围外统一使用shadowmask,所以不存在需要混合的情况。故而LIGHTMAP_SHADOW_MIXING关闭。同时这个模式依然自带SHADOWS_SHADOWMASK宏。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值