最佳实践 | 在Unity中创作逼真的视觉效果
Unity Spotlight团队和优秀的Unity开发人员一起合作,深度挖掘Unity在游戏开发中的潜力。Spotlight团队的技术艺术总监Rinaldo Tjan的一个重要职责就是帮助开发者使他们的项目达到预期的外观与质量。很多项目对视觉真实感要求很高。在既定美术内容的前提下,我们要如何在Unity中创建一个看起来十分逼真的场景呢?
要达到以假乱真的视觉效果,涉及多个方面。在本文中将由Rinaldo Tjan介绍Unity项目开发中的光照和渲染设置,分享Spotlight隧道示例场景。
准备Unity渲染设置
理解如何使用Unity的渲染功能够真实地模拟现实世界,有助你达成项目的视觉目标。
线性渲染模式
简单的说, 线性渲染模式下,Unity将先使用物理上精确的数学进行光照和着色计算,而后再把最终输出转变为符合监视器的最佳格式。
如果要指定一个Gamma或线性工作流程,请点击Edit > Project Settings > Player,打开Player Settings。然后点击Other Settings > Rendering ,将Color Space修改为Linear。
通常应避免使用Gamma色彩空间,除非真实硬件有限制。未来Unity将会移除Gamma色彩空间。决定使用哪种色彩空间是项目初期就应考虑的问题,因为它会对最终的着色和光照结果产生巨大影响。
渲染模式
在Spotlight隧道示例场景中,我们使用了延迟渲染路径。这让开发者可以高效地使用多个动态光照,整合多个反射立方体贴图,并使用在Unity 2017或更高版本中内置的屏幕空间反射特性。
要设置此功能,请点击菜单Graphic Settings > Rendering Path or Camera > Rendering Path。
高动态范围(HDR)摄像机
当渲染逼真的场景光照时,开发者将需要处理亮度大于1(高动态范围)的光照值与发光表面。随后将这些值重新映射到合适的屏幕范围,这被称为色调映射。要让Unity摄像机正确处理这些超范围的过高值,而不是截断它们,这个设置至关重要。
要启用此功能,选择场景中的主摄像机,勾选检视窗口中的HDR选项。
HDR光照贴图编码(可选项)
Spotlight隧道示例场景没有使用烘焙光照,如果你打算使用高密度(HDR)烘焙光照,我们推荐你将光照贴图编码设置为HDR光照贴图,以使烘焙光照结果保持一致。
此选项请点击菜单Edit > Project > Player settings > Other settings > Lightmap encoding 。请注意:该选项仅在Unity 2017.3及更高版本中使用。
将场景设置色调映射
要正确显示HDR光照,需要在项目中启用一个色调映射器。
首先你要先从Asset Store资源商店下载安装后期处理特效包 Unity Post Processing Stack v1。
在项目中新建一个Post Process Profile Asset,并按照以下方式进行配置:
启用Color Grading > Tonemapper > ACES
(Academy Color 编码标准)启用Dithering(抖动)。来自HDR场景的8位/通道输出会产生banding artifact,抖动可以缓解这个问题。现代引擎使用这项技术规避16M色彩输出的限制。色调映射器的其它设置现在暂不做修改。
选择“Main Camera”,然后添加组件Post Processing Behaviour。
将前面创建的Post Process配置文件赋予配置文件栏位。如果你想使用Post Processing Stack Version 2,请参考该资源包中的说明文件,该资源包目前仍处于Beta测试阶段。
启用Image effect for viewport。
这让你在任何时候都能在场景视图中查看色调映射器。
请注意:在经过色调映射的场景中,高光还原与黑暗隧道值分离得到了改善。而在未经过色调映射场景中,高光不会汇集成一个统一的颜色。
设置流程基本上就是在复制数码相机使用一个固定曝光度捕捉场景的方式(不启用曝光适应/人眼适应功能)。
现在开发者已经获得一个合适基础场景渲染的设置。
光照和设置
Unity能适应多种不同的光照策略/系统与项目场景。不过出于快速迭代与简单性考虑,响应式的视觉反馈是必须的。
Spotlight隧道示例场景使用了GI实时光照。这能为我们提供一个不错的镜面反射响应范围,良好的反射光照以及实时修改光照设置的能力。
使用实时GI和光照探头实现实时光照
回到光照本身,一个典型的拥有室外区域的白昼场景,可以分解为3个光照组件:
Hemisphere (Sky contribution)-半球(天空贡献值)。
Direct lights (Sun + Local lights)-直接光照(日光+局部光照)。
Indirect illumination (GI lighting)-间接光照(GI光照)。
在这个阶段,开发者应当已有一个搭建完成且贴图正确的场景。
室外光照与设置
初始半球光照
户外光照的第一个组件是半球光照,在Unity中它被成为环境光照(Environment Lighting)。夜空的贡献值最小,而白昼天空的亮度贡献值非常高。半球设置可以在Lighting中找到(Window > Lighting > Settings > Environment)。
作为起步,最好使用程序化天空盒材质(procedural skybox material),而非HDRI立方体贴图。在项目中新建一个名为SkyMaterial的材质,然后将它设为Skybox / Procedural。
在Lighting选项卡下的Scene中,将它赋予Environment Skybox Material。
此时场景已有点光亮。但这还不是正确的半球光照,我们现在先暂时不进行处理。
定向光
典型的日光或月光是一种接近于无限远,且拥有平行光线和阴影的光源。我们通常用一个定向光来代表它们。
间接光照/全局光照
仅靠定向光和环境并不能创造出逼着的光照。正确的半球光照需要有环境光遮蔽。我们还需要模拟日光在场景中对不同对象间的反弹。当前天空使用一个单一颜色值来渲染场景,因此看起来有点扁平。现在需要使用实时全局光照或烘焙光照,计算遮蔽与间接反弹光照。
请按照以下步骤进行操作:
确保所有参与实时GI或烘焙的网格都已被标记为Enable Lightmap Static和Reflection Probe Static。这通常会是一些大型的静态网格。
点击Lighting > Scene > Realtime Lighting中的实时全局光照(保持default-medium设置)。
点击Generate Lighting或勾选Auto Generate。
光照生成结束后场景现在很暗。更糟的是,场景中的一些元素出现了异常。注意有轨电车以及背景中的门。
场景中的静态对象已经获得了正确的半球光照遮蔽,以及来自定向光的间接反射,但是剩下的对象缺少正确的光照设置。
光照探头和反射探头
要让动态对象或无光照贴图的对象接收动态/烘焙全局光照,必须要在场景中分布光照探头,确保将光照探头组有效地分布在场景中需动态光照的对象所在位置或必经之地。
再次点击Generate Lighting,或者如果已勾选Auto Generate,则等待预计算完成。
现在有轨电车和背景中的门现在好一点了,但是缺少了反射。来自天空光照反射无处不在,隧道内也会存在。这时就需要用到反射探头了。根据需要在场景中有效地布置反射探头。在上面的场景中,主空间只需要一个反射探头就足够,两端的隧道内部各需要一个。一般来说,采用盒状投影,128像素立方体贴图分辨率,会是个不错的基准选择,并且这能使内存消耗和反射烘焙的时间不至于太夸张。
场景现在看起来已正确融成一体,但是所有的东西比以前更黑了,丝毫没有接近逼真质量。
HDR光照值
许多开发者没有意识到,在现实中半球光照与日光是非常亮的光源。它们要比值1亮得多。这就是我们为什么需要引入HDR光照。
现在关闭定向光,然后把SkyMaterial Exposure设为16。这将能很好地向你说明正确半球光照对于场景的作用。
一切开始看起来好多了。想象这是一个多云的日子,日光在天空中被完全散射,因此没有定向光。
此时你可以重新在场景中引入亮度值很高的日光。试试从强度5开始。尽管阳光看起来接近于白色,但正确选择定向光的颜色十分重要,因为来自猛烈太阳的间接颜色将会对场景的外观产生显著的影响。
现在太阳(定向光)看起来就像现实中一般,这是一个高能光源。场景这时候看起来更加真实了。
屏幕空间环境遮蔽和屏幕空间反射
场景光照这时候看起来很不错,你还可以通过添加一些细节让它更好。烘焙细节遮蔽通常无法做到,因为出于性能考虑,在实时GI中只有有限的分辨率集。此时屏幕空间环境遮蔽可以帮你。在Ambient occlusion下,启用Post Process配置中的SSAO。本示例中,Intensity为0.5,Radius为1,并已勾选Medium Sample count w/ Downsampling and Ambient Only。
SSAO可以处理额外的环境光照遮蔽,而在反射方面可以在简单的反射探头之外再做些精确的改进。
屏幕空间光线追踪反射可以帮助改善这种情况。在Post Process配置中启用Screen Space Reflection。
请注意:左侧湿漉漉的轨道不再渲染出明亮的反射,因为SSR会给予屏幕上的对象更为精确的反射效果。这二种后期处理效果都会在运行时对性能产生影响,所以好好使用,选择一个适合你运行时性能约束范围的质量设置。
雾
到这个阶段,开发者已基于一个固定的曝光值,获得了较为逼真的室内与室外值分离效果。反射在黑暗的室内区域表现为强烈的高光以及不太昏暗混浊的区域。
但是,尽管有一些强透视的元素,场景的前景元素和背景元素没有出现。一团精细的雾可以为场景增添额外的纬度,使它大为不同。
请注意:前景中的栏杆与没有雾的场景相比,要更加的清晰。
现在可以点击Lighting > Scene > Other Settings中启用雾。雾颜色#6D6B4EFF,指数0.025密度已启用。在Unity 2017的延迟渲染中,如果它没有自动激活,你可能还需要在后期处理配置中启用雾。
室内与局部光照
聚光灯/点光源
实时局部光照主要是聚光灯和电光源。区域光仅在烘焙时可用,除非你使用在Unity 2018.1 beta中引入的高清可编程渲染管线(HD SRP)。在HD SRP模式中,有可实时渲染的新区域光。
从根本上而言,这二种类型的光照都从空间中的一个点发出具有范围限制的光线,而聚光灯有一个额外的角度限制。
聚光灯和点光源最大的区别在于,它们投射阴影以及与剪影进行交互的方式。一个点光源的阴影需要6个阴影贴图,而一个聚光灯则只需要单个阴影贴图即可。因此,点光源要比聚光灯消耗更大,应当节省使用。请注意:烘焙光照不需要担心这个问题。
另一个区别是,聚光灯上的剪影纹理只是一个简单的2D纹理,而点光源则需要一个立方体贴图,这个贴图通常要在3D软件中制作。
颜色与光照强度
在为你的光照选择合适的颜色与强度时,需要遵循一些较宽松的指导意见,以获得较为真实的效果。
当选择室内光照的强度时,不要让任何室内光照的强度超过日光的强度。否则会产生不平衡的感觉。
根据示例场景的设置,不可能会出现来自天花板的高强度光照超过白天亮度的情况发生。
当选择一个颜色时,不要完全舍弃某个颜色通道。这会造成光照无法汇聚叠加成白色的点。
从技术上而言,这是个有效的光照颜色,左侧图片中的光照颜色在最终的颜色输出中移除了所有蓝色成分。对作为基准场景的最终调色板做限制可不是什么好主意,尤其是当你在后续还要进行颜色分级时。
发光表面
在Unity中,如果启用了实时GI或烘焙GI,发光表面会对光照计算提供贡献,发挥区域光的效果。当实时GI启用时,这尤其有用。开发者可以修改发光表面的强度和颜色,并立即获得反馈,假定预计算已提前完成。
此图展示了细微的漫反射光照从天花板上的网格发出
示例项目文件
Unity Spotlight团队已创建了Spotlight隧道示例场景,帮助开发者进行动手学习与实验。此项目使用Unity 2017.1.0 f3 创作,只需简单地解压,并用Unity打开项目即可。
下载Spotlight隧道示例场景请点击[阅读原文]!
由于不同版本间可能存在光照数据格式的不兼容,所以如果用更新的Unity打开此项目,将需要进行光照重建。
小结
希望本文能帮助开发者跟进我们在使用Unity获得逼真的视觉效果方面所做的努力。要创作逼真的视觉效果,你还需要了解更多的东西。我们后续会继续发布一系列相关最佳最佳实践指南内容。更多 Unity精彩技术内容请访问Unity中文官方论坛(Unitychina.cn)!
最佳实践系列文章
官方活动
时间:截止到3月31日 线上促销
促销地址:https://store.unity.com/cn/offer/plus-triple-boost
活动信息:5月11-13日 北京国家会议中心
售票官网: http://unite2018.csdn.net/ 或者直接扫描下图二维码进行购票!
点击“阅读原文”访问Unity官方论坛