Unity的Enlighten全局光照实践

Unity的Enlighten全局光照实践

这是侑虎科技第488篇文章,感谢作者CG-Bull供稿。欢迎转发分享,未经作者授权请勿转载。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群:793972859)

作者主页:https://www.zhihu.com/people/flashbull/activities,作者也是U Sparkle活动参与者,UWA欢迎更多开发朋友加入U Sparkle开发者计划,这个舞台有你更精彩!


今天笔者主要分享的是Unity的Enlighten全局光照,如果大家不清楚这个东西可以戳以下链接查看详情:
http://forum.china.unity3d.com/thread-22888-1-22.html

同时,我们不妨先看看以下效果:
今天分享的文章也是为了方便大家在Unity里面做出高质量画面渲染,以下图片供大家参考:

请输入图片描述
请输入图片描述
请输入图片描述
请输入图片描述
请输入图片描述
PS:这里模型和贴图均来自EV的第37套模型库

Maya里面处理好模型和2UV即可导入Unity环境下,材质均使用自带的Standard。因为是分享UnityLighting自然用ArchViz来展示是最适合不过的了。同时也可以测试一下Unity的全局光照精度的极限。

Unity一直以来被诟病的基本都是画面差,市面上大部分Unity产品或者游戏看着也确实没有Unreal和Frosbite系列的游戏那么有次世代的感觉。考虑到全世界都是一种类型大同小异的PBR,排除渲染方程导致的差异,那么效果不够好的主要原因或许就是因为没有一个比较真实的全局光照(GI)系统和没有比较全面的后期处理(PostProcess)系统。但实际上是Frosbite和Unity基本都是一套Enlighten的全局光照系统。那么Unity到底能不能做真实的渲染效果呢?这里先打个问号。

当场景素材摆放好后大概是下面的样子:
请输入图片描述

可以看到画面效果非常"真实"。之后第一步则是制作一个光照环境,自古好看来自日出日落。所以在这儿也选择了一个日落的时间点。这里提醒一下,我见过的美术大部分都不喜欢用HDRI去做环境光而是去在窗户上放聚光灯阵列或者面光源去模拟,这样的话会失去环境颜色的DirectionLight,所以这里我的搭配则是DirectionLight和EnvironmentLight。既然日落自然也需要一个日落的HDRI。将这些设置好后就可以设置光照烘焙内容了。

请输入图片描述
请输入图片描述

因为这里已经开着GI了而AO是模拟GI用的。所以一般都是二选一,如果共存会产生奇怪的脏点效果。

请输入图片描述
请输入图片描述

太阳光这里使用了ShadowMaks,因为考虑到室内可能会有动态物体,比如:角色在里面走,也是为了能够产生太阳的高光点,如果使用Bake的话,烘焙完后场景就等于没有这个灯光了,那么太阳的高光也会随之消失。ShadowAngle则是为了产生自然的软阴影效果。

随即进行Bake,完成之后则会得到如下图所示,可以看到Enlighten还是能产生比较好的全局光照(GI)效果的。

请输入图片描述

然后我们看到虽然有了挺不错的全局光照(GI)效果但是画面感却很死寂,里面的金属也都是黑色的。主要原因是Enlighten只能Bake出Diffuse的全局光照(GI)而不能产生Speculer的全局光照(GI)。好在Unity和其他引擎一样也提供了其他的解决方案就是反射探测器(ReflectionPrbes),(吐槽一下,这个反射探测器居然只能做Box的视差矫正而且还不能旋转。不过新的HDRP里面测试到时可以旋转了,同时也有了Sphere的视差矫正),然后我们在场景中放上反射探测器 (ReflectionPrbes)。因为这个室内刚好是比较规则的正方形分布,所以只需要用Box的探测器去覆盖到场景即可。

请输入图片描述
请输入图片描述
请输入图片描述

然后将反射球里面的参数调整好随机点击Bake,即可产生反射用的Cubemap数据。因为场景目前没有什么动态需要,所以更新模式用Bake即可。如果你使用的是实时光照环境且光照可互动,那切换到Dynamic模式或许是个不错的选择。随机效果如下:

请输入图片描述

可以看到场景的金属不再黑了,看起来的效果也没之前那么死寂。

但是感觉好像还是有什么不对劲。没错!Unity的内置渲染管线默认是不带后期处理(PostProcess)的,这也是为什么Unreal转Unity的大部分会感觉Unity效果很一般的主要原因吧。好在官方也很努力跟进出了PostProcessStack。这里使用GitHub最新的UnityPostProcessStackV2,不知道的可以去下面的链接下载:
https://lab.uwa4d.com/lab/5b55f46dd7f10a201fd77c3b

大家可以根据自己的画面喜好去调整参数。这里给出我的参数,效果感觉还不错。

请输入图片描述
请输入图片描述

最后即可得到如开头的图片那样的光照场景。

请输入图片描述

可以看到瞬间画面就高大上了,但是还有一种很不对劲的感觉,那是因为场景里面反射不正确,实时渲染里面的反射主流的除了IBR另外就是SSR了。

请输入图片描述

可以看到在加入了之前说过的StochasticSSR之后画面瞬间就好了不少,特别是地板和阳台的金属框。下面放上SSR的地址:
https://lab.uwa4d.com/lab/5b55f122d7f10a201fd76cc5

进行到这儿可以看到还是很难区分是Unity还是Unreal的,也侧面反映了Unity的Enlighten还是能够做到不错的全局光照(GI)效果的。而后说一下Unity新出的ProgressiveLightmap。

经过上面的分享和测试可以看到Enlighten是可以得到3A级的GI效果的,那为什么Unity还要出一个ProgrssiveLightmap呢?再经过上面场景制作之前的多次光照测试得到的总结就是:Enlighten虽然可以产生很棒的全局光照效果,但是精细程度并不够。举个例子,如图:

请输入图片描述

可以看到椅子的腿下面产生了很自然的环境光阴影,而桌子腿因为太细导致这个很漂亮的阴影直接消失。

为了解决这个问题,我测试了Enlighten的极限。在IndirectResolution为10和LightingProfile里的Resolution为5的情况下可以产生一些这种极致的细节阴影,但是Bake时间会蹭大道原来的几十倍。因此测试了一下ProgrsssiveLightmap(设置都一样只需要在Lighting界面把Enlighten换成Progrssive重新Bake即可)。

请输入图片描述
Enlighten的可以看到椅子腿基本没阴影了

请输入图片描述
Progrssive的可以看到椅子腿有明显的接触阴影效果

或许因为速度和精度考虑,Unity官方才出了Progrssive来替代Enlighten做高质量的LightingBake。但是就目前测试来看Progrssive的速度也是很堪忧,上图在i9上Bake了近乎7小时,而Enlighten则只用了30分钟不到。鉴于2018.3也推出了GPUProgrssive的预览版,官方表示速度快10X,具体不详。各位有兴趣可以试试!

以下是这个分享之前的测试图:

请输入图片描述
ProgrssiveLightmap

请输入图片描述
Enlighten:注意看左边书桌上的阴影细节

请输入图片描述
实时的Enlighten环境光测试

请输入图片描述
实时的Enlighten直射光测试

请输入图片描述
实时的Enlighten自发光测试

一段Enlighten的测试