Unity引擎即将迈入2017的新时代,并且不久前我们也发布了Unity 2017的首个测试版Unity 2017.1.0 Beta。在本教程中,我们将通过实际案例来说明如何在一个简单的游戏场景中使用Unity 2017的Shadowmask功能。场景设置包括室内和室外两部分。室内部分的阴影将使用Shadowmask模式,而室外的阴影将使用Distance Shadowmask。场景非常简单,以便能更好的解释这些功能的实现原理。

 

在介绍细节前,让我们先看下大致内容:

  • 场景设置与光照参数

  • 通过API切换Shadowmask和Distance Shadowmask

  • 修改光照贴图参数避免带状阴影瑕疵(针对软阴影)

  • 快速了解其他可加强效果的后处理特效

 

我们的教程将从调整光照参数开始。考虑到要进行数次迭代,我们要先将默认参数调低。否则即便是默认的设置也会对性能造成显著影响。完成后我们可以将参数重新调整为高质量。

 

请点击【阅读原文】下载本教程的示例工程。

 

 

场景设置与光照参数

首先,我们要先禁用Realtime Global Illumination,因为本教程不涉及此功能。但是,我们要使用Baked Global Illumination,并保持光照模式为Shadowmask。其次,将Indirect Resolution调低至0.2,Lightmap Resolution调整为15。最后,将Lightmap Parameters从Default-Medium改为Default-Low Resolution。这些设置会产生一些阴影瑕疵以及低分辨率效果,但这会使我们场景的光照迭代速度更快。否则,哪怕是极小的参数调整也会使我们处于漫长的等待之中。

 

 

根据计算机的设置,下一步设置是可选的。默认情况下,Lighting窗口中的Auto模式是启用的,这通常很适合小场景。但对于大型场景,每个小改变都会触发光照生成,使编辑器变慢,有时还会造成无法对场景进行编辑。因此,我通常会禁用它,在评估过上次的结果并完成更改后再生成光照。你可以任选其中一种方式。

 

至于色彩空间,使用Linear,以获得更精确的色彩效果,渲染路径选择延迟。这些设置都用于高端游戏,实际上,如果想使用反射探针和SSR获得正确的反射效果,就必须使用延迟路径。目前,前向模式不支持SSR,该模式下反射探针的显示也有问题。随着Unity弃用Directional Specular,目前推荐的解决方案就是使用反射探针和SSR。所以,在我们的场景设置中,反射将扮演一个非常重要的角色,因此,我们将切换到延迟渲染路径。

 

接下来,检查下场景中所有的对象,一个可以操作的角色,室外环境,室内环境,碰撞器,遮阳板以及光照相关对象。

 

为每个类型的对象创建一个新的图层,使用碰撞器为关卡设定可玩区域,使用遮阳板操纵阴影(它们对主摄像机不可见)。使用遮阳板是因为我们用于构建室内环境的几何体背面缺失,无法作为遮光物,挡住光线。而且因为它们不会在屏幕上进行渲染,我们可以将这些对象的质量设为低质量。相信我,这个技术也在真实生产环境中使用(呃,可能没有我们这里做的那么简单)。

 

 

对于光照,我们使用四种不同的对象类型:一个定向光,环境光,反射探针以及光照探针。为了简单,我们仅使用一个定向光,因为美术光照不在本文探讨范围之内,我们仅专注讨论Shadowmask功能的技术细节。正确设置光照探针和反射探针很繁琐,而这通常又是新手容易出问题的地方。因此我们将分析布置光照探针以及反射探针的正确方式。在进行设置时,最新的Light Explorer面板将会为我们提供很大帮助。

 

还有一个重要的部分是环境光照。我们只是简单的将天空盒着色器指定为环境光的一部分(可以在项目中找到这个资源)。如果仔细研究这个天空盒材质,你会发现它是一个sIBL HDR。HDR图像对室外场景特别有用,它可以提供原本需要花很大成本重建的详细的BRDF信息。

 

最后,有来自Unity Standard Assets中的一个角色,一个附加有自定义后期处理与动画组件的自定义摄像机脚本。

 

通过API切换Shadowmask和Distance Shadowmask

上一节说过,当角色走出去后,我们会将Light Mode从Shadowmask切换为Distance Shadowmask,反之亦然。这样,我们可以在室内环境保持烘焙软阴影,并在室外时切换到轮廓清晰的实时阴影。而且你可能想不到,做法也相当简单。只需将下面的代码复制到一个触发器即可:

 

 

很简单吧!

 

修改光照贴图参数避免带状阴影瑕疵

Unity中的默认设置与一个高质量项目的要求非常相近。正如本文开头所说的那样,这会使大场景的渲染时间显著增加,因此我们需要对参数进行一些调整。

 

为了进行迭代,我们调低了参数,但如果连默认设置都没法正常工作该怎么办?以Shadowmask为例,软阴影就是一个典型的问题。下面来看看这样一个案例:

 

 

该如何解决这个问题?增加光照贴图分辨率,或者光照贴图大小?

 

除了光照窗口,我们还可以针对特定对象进行参数调整。还记得我们在开始时将Lightmap Parameters调整为Default-LowResolution吗?你实际上可以以实例为单位指定自定义光照贴图参数,覆盖场景设置

 

首先禁用了Lighting窗口中的“Compress Lightmaps”,然后为金属板创建了一个自定义光照贴图参数,并将Blur Radius设为8, Direct Light Quality设为128。现在看看结果如何:

 

 

好多了,对吗?而且,我调整了Enlighten中关于集群优化的Precomputed Realtime GI值,然后将自定义光照贴图参数指定给了场景中不同的对象。下面是金属板的相关设置。但这些参数的细节不在本文介绍的范围之内。你可以查看Unity3D网站上有关Precomputed Realtime GI的教程以了解更多信息。

 

 

快速了解其他可加强效果的后处理特效

除了Screen Space Reflections之外,我们还使用TAA(Temporal Anti-aliasing)Ambient Occlusion、Color Grading、Chromatic Aberration、Grain 和Vignette。对于当前的场景,这些效果的默认值就足够好了(有可能Ambient Occlusion的半径值可以再缩小一些)。不过,我们将会对TAA和颜色分级再做些微调。

 

我使用色彩分级(Color Grading)来营造一种魔法时刻的意境,Temperature稍高,其他的参数相应进行微调,使之与阴影产生对比。

 

 

TAA是目前业内最快的抗锯齿解决方案。但有一个缺点:TAA与透明度相容性不佳,而且有时与环境遮蔽一起混合时会出现问题。除此之外,它仍是一个相当不错的效果,应用之后可以带来显著的变化。

 

要使用它,必须首先禁用Quality Settings中的MSAA。转到Edit > Project Settings > Quality,在Rendering部分找到Anti Aliasing。将其改为“Disabled”。然后,还必须在摄像机上禁用它。选择层级窗口中的主摄像机,在探查器的Camera组件中找到“Allow MSAA”选项,取消勾选。

 

现在可以启用TAA了。选择后期处理探查器,启用Anti-aliasing。切换到Temporal Anti-aliasing。你可以增加spread的值,不惜代价避免抖动,但给你个专业建议,绝对不要将spread设置为1.0。我们的测试表明,spread最佳的区间为0.9到0.97,具体根据场景设置而定。

锐亚教育