在实际项目中会有这样一种需求,我们想要对某个或某一类物体,比如角色,单独打光,但同时又想让场景中所有物体的阴影都依赖于同一个主光源。

比如这样,Unity 截图:

上图右边球体不受场景主光,也就是左侧定向光影响,而是单独打光,同时却能通过场景主光投射阴影。这在 Unity 中可以通过 Rendering Layers,也就是 Light Layer + Custom Shadow Layer 轻松实现。

而 UE 并没有像 Unity Rendering Layer 这么方便的系统,只有三个通道的 Light Channels 也并没有那么自由,做不到光源只投射阴影而不着色,至少据我所知。

不过经实验,在 UE5.1 移动端可以钻 Light Channels 的空子来实现这一效果。

UE5.1 对移动端 Light Channels 支持了一波,但依旧有限制,其规则具体来说就是:

  • 一个光源只能有一个 light channel。如果勾选多个 light channel,则着色时应用规则:
    • light channel[A][B] = light channel[min(A, B)]
    • 即,例如如果同时勾选 channel[1]channel[2],则光源在着色时 light channel 实际为 channel[1]
  • 一个物体可以有多个 light channel,即可受到来自不同 channel 光源的影响。
  • 场景中如果有复数个定向光,必须分别属于不同的 light channel。
  • 只有 channel[0] 的定向光,也就是主光,才能对场景中物体投射阴影。

然而经试验发现,对于场景主光 channel[0],其在计算阴影时是没有“光源只能有一个 light channel”这个限制的。

如下图所示,左侧主光为 channel[0][1],右侧定向光为 channel[1],两个球体左侧 channel[0],右侧 channel[1]

实际结果在着色时左侧主光只影响了 channel[0] 的物体,但在阴影计算时对 channel[0]channel[1] 的物体都进行了计算。

经打包测试,VK 和 GLES 均没有问题。

但这算是比较 hack 的做法,正如前文所说,是钻了移动端的空子。

在 PC 端就不行了,PC 端光源没有单 channel 的限制,做不到“只投射阴影而不着色”:

总之记录一下。