[转载]在Unity中制作高质量的光照效果(中)

本专家指南将介绍在Unity中制作高质量光照效果的多种高级方法,其中使用了2D和立方体贴图的光线遮罩,并且利用了Unity高清渲染管线HDRP中的高级着色器。

Head Pic:【オリジナル】「苦い春」/「banishment」



在上一遍中,我们梳理了常见光照问题,学习使用2D纹理,立方体贴图创建遮罩。在本篇中,我们将分享如何在Unity中导入遮罩和进行光照设置。

遮罩导入

我们将立方体贴图导出到Asset文件夹。如果磁盘空间、传输速度、资源大小和处理时间都是重要参数,那么请避免在Asset文件夹保存较大的PSD源文件。
如果使用默认内置渲染管线,请使用以下纹理设置。纹理是2D贴图时,把Light Type设为Spot;纹理是立方体贴图时,把Light Type设为Point。

如果使用HDRP高清渲染管线,请使用以下纹理设置。纹理是2D贴图时,把Texture Shape设为2D;纹理是立方体贴图时,把Texture Shape设为Cube。

我们可以手动调整每个纹理的分辨率,尽量减小纹理的大小以减少其内存占用,特别是处理立方体贴图时,这类贴图通常比普通2D遮罩大6倍。
128到512个遮罩通常可以提供足够的细节,对于仅运行在高端电脑的项目而言,该参数的影响性较小。

对所有遮罩设置最大全局分辨率,请选中高清渲染管线资源,在检视窗口调整Cookies下的设置。

最后,选中场景中的光线游戏对象,指定纹理到Cookie字段。

光照设置

高清晰渲染管线HDRP中的光线游戏对象提供多种新功能。对于光照设备而言,了解下面的参数很重要。

了解如何设置场景,请访问Post Processing Stack文档:
https://github.com/Unity-Technologies/PostProcessing/wiki

曝光度

设置场景光照之前,理解曝光值的概念会很有帮助。曝光度通过EV单位系统来表示,准确来说单位是EV100,它对应着ISO 100的曝光值。
例如:常见的阳光场景会返回约EV 15的曝光值,而月光场景返回的曝光值约为EV -5。在处理室内光照时,曝光值的范围通常在EV 4和EV 7之间。
我们可以在Unity中模拟这些曝光值。选中后期处理资源,转到检视窗口,在Auto Exposure设置中,调整Minimum (EV)属性。
如果想确保场景不会超过设置等级过度曝光,请把Minimum (EV)设为5,这样室内效果会如预期一样暗。

Unity只支持EV -9,亮度约为由星光照亮的非常暗的夜晚到EV +9,亮度约为非常暗的阴天的范围,这意味着使用基于物理的阳光强度为80,000 lux,即EV 15的时候,会得到过于明亮的场景。
为了适应明亮的阳光,游戏开发的常用解决方法是使用5000到10000 lux的太阳光强度,并把Exposure Compensation设为1.0,减小Minimum (EV)。但这显然不是达到物理准确性的最佳方法。
目前针对高清晰渲染管线HDRP开发的新后期处理功能会解决这个问题,提供几乎无限大的曝光值范围。本文中的所有示例专注于室内光照,因此Post Processing Stack V2中的受限曝光值范围不会产生任何问题。

色调映射

在计算机图形学中,色调映射是使具有高动态范围(HDR)的计算机生成图像适应较低动态范围(LDR)显示设备的过程,例如:电视、PC显示器、手机屏幕等。
没有色调映射或中度色调映射的图像,通常会在屏幕上显示受限的高光瑕疵。

现今色调映射的工业标准基于学院色彩编码系统(ACES)。从视觉效果上看,这种技术允许我们模拟电影的光照反馈,明亮的像素会向不饱和的白色聚集,产生不美观的“线性”效果,这种情况常见于早期的游戏中。
去饱和处理对保持明亮受光材质的最佳着色很重要,因此在处理强烈的发光材质和高对比度光照时也特别重要。

ACES色调映射可以加入更强烈的对比度,特别是使用Neutral色调映射调整光照时,这种色调映射默认产生比较有平面感的视觉效果。
使用ACES时,我们可以使用Contrast或Gamma滑块等参数,自然地降低对比度并提高中间色调。
如下图所示,左侧Neutral tone色调映射,高光的饱和度过高,整体图像比较平面感。右侧ACES色调映射,高光向白色聚集,光照反应更加逼真。

屏幕空间环境遮蔽(SSAO)

后期处理的环境遮蔽是游戏中的常用效果,它会模拟不同深度的表面之间环境光线的遮蔽,仅使用屏幕上的信息。

后期处理的环境遮蔽效果在有机的嘈杂环境中非常高效,但是在具有清晰材质和平坦硬面的高质量渲染环境中,它会产生不理想的伪影,例如:小型对象周围的黑暗角落和光环效果。
如下图所示效果,从左至右SSAO的强度分别为0.0、0.5、1.0。

发射率

对于光照设备的发光表面,要使用专用的发光纹理,而不是平面的发光HDR颜色。
现实中,在观察灯泡和光照设备时,健康的人眼可以区分出细微的光亮细节,因此没有亮度变化的固体发光源不会提供逼真的效果,特别是对于较大表面。

我们使用Photoshop以16或32位模式,通过很高的F光圈强度来绘制纹理。这样我们可以创建非常明亮的高光,不必大幅提高材质的HDR颜色强度。这还可以避免在使用8位纹理作为发射源时,可能出现常见的压缩伪影。

光线强度单位

现实中,灯泡和光照系统的强度会用不同单位表示,这取决于应用行业和制造商。Unity会根据具体的工作流程提供不同的单位。
在高清晰渲染管线HDRP中,严格的光强度由流明(Lumen)、坎德拉(Candela)、x米的勒克斯(Lux at x Meter)和EV进行定义。
流明(lm)定义了光源产生的光通量,它表示可以离开光源的光线总量。如果把光线比作液体,流明就对应流速。
为了衡量灯泡或台灯的光输出总量,被测光照设备会放在积分球测试仪中,积分球内表面有反射性的白色涂层,检测器会衡量球体中的漫反射光照。
因此流明不会提供任何关于光照设备的定向信息,流明单位常用于模拟朝所有方向发射等量光线的球形光,而不是朝某个方向发射的光。
例如,如果模拟800 lm的常见灯泡,我们可以把光线游戏对象的Intensity设为800。然而,如果在灯泡旁放置灯罩,假设在Unity中灯罩不会投射阴影,则附近表面接收的光照会太强,因为场景的灯罩不会实时遮蔽光照。
如下图所示,左侧为800lm的光照效果,我们可以看见墙体受程度太强。右侧模拟灯罩遮蔽的400 lm 投射到墙上的光,会显得更为逼真。

在处理聚光灯等集中的光照时,我们需要仔细考虑流明单位。根据定义,流明不会指定光照的方向。
如果模拟规格为1200 lm和最大角度为110度的聚光灯,我们需要在光线对象的检视窗口启用Reflector,从而接收集中光照的正确光量。

如下图所示,左侧是禁用Reflector的聚光灯,指定的光线量不会集中。右侧启用Reflector后,光照被正确的集中起来。

启用Reflector时,如果光束变窄,接触表面的光线量会增加。如果光束变宽,接触表面的光线量会减少。
如下图光照场景效果,启用了用Reflector,左侧聚光灯角度为135度,右侧为20度。

坎德拉(cd)是一种更直观的测量单位,它定义了从特定角度观测的光强度。1cd大概等于1个“烛光”单位,这是标准蜡烛的亮度。
如果我们站在光照设备的完整阴影下,我们观察的结果几乎为0cd。如果站在最亮的区域,我们会测量到数百坎德拉。重点的是要注意和光照设备的距离不会产生影响。
IES光线配置文件使用坎德拉来定义光照周围多个角度的光强度。Unity不支持IES文件格式,但我们可以把它们烘焙到2D或立方体贴图遮罩中。
在光照设备制造商说明产品产生的坎德拉量时,通常仅提供从最佳角度测量的最大光强度。对于3000cd的家庭聚光灯,最佳位置会在灯光投射的中间部分,对于老式8cd的煤气灯,最佳位置则在灯的侧面。
X米的勒克斯(Lux at x meters)定义了表面在距光源的特定距离处接收的光量,这种类型的测量在模拟专业电影光照时特别实用。专业聚光灯和泛光灯的规格通常包含任意距离的勒克斯测量结果。
在为室内和室外环境设计照明时,建筑师、设计师和工程师会使用以勒克斯为单位的推荐亮度等级。例如,公路隧道通常需要至少20勒克斯的光量,家用厨房需要150勒克斯,在工程实验室中使用复杂机械时,2000勒克斯是要求的最低光量。

色温

Unity提供二种颜色模型,以实现最大灵活度。请启用Color temperature来处理白炽灯模型,单位为开尔文。我们可以使用额外的颜色滤镜来模拟不同光照效果,例如:彩色玻璃,反射板和彩色胶体。
由于Unity缺乏自动白平衡功能,在特定情况下,使用基于物理的色温模型会产生不自然的暖色饱和的光照。这意味着白炽灯的灯光在颜色校正前通常看起来不真实。

在现实中,聚光灯的色温为3200开尔文。为了模拟人眼的颜色适应,或是摄像机的自动或手动白平衡,我们可以手动设置较冷的颜色,也可以对光线添加滤镜,还可以使用后期处理的颜色分级来调整色温和着色,从而产生更加真实和平衡的效果。

如下图所示,左侧为3200开尔文,没有白平衡的聚光灯,生成图像的暖色过强。中间为3200开尔文,通过颜色分级实现白平衡的聚光灯,右侧为任意颜色,无白平衡的聚光灯,二个场景效果显得更具真实感。

和真实照片或摄像机一样,如果使用了错误的自动白平衡预设,例如白炽灯而不是日光灯,那么颜色会很难改变。
下面图像展示的灯管使用了较冷的颜色,5000开尔文的色温,通过LUT或Unity的颜色分级工具,在Unity中钨丝灯风格的颜色校正实现白平衡。左侧的效果更为真实,右侧的色温则过低。

使用基于体积或根据摄像机的颜色分级可以减少这些实际问题。在任何情况下,如果问题过于复杂,无法在环境中解决,我们都可以使用自选的颜色,特别是在环境包含各种光照类型的时候。
本篇专家指南中展示的大多数光照设备,我们使用了精心挑选的颜色,而不是开尔文色温。这展示了物理准确性和艺术自由度之间的冲突,以及无法使用管线的特定部分时,基于现实的工作流程会如何提高复杂度。

间接倍数

通过烘焙全局光照或实时全局光照解决方案烘焙光线时,Unity不支持遮罩。因此,在使用包含大量遮蔽的立方体贴图遮罩时,Unity场景经常会生成过多间接光照。
以下管形灯的顶部,即立方体贴图第六个面,存在很强的遮蔽。

为了解决此问题,我们需要减小光线游戏对象的Indirect Multiplier(间接倍数)。找到满意的Indirect Multiplier值的方法是,观察遮罩的平均亮度。
在Photoshop中,打开直方图工具,找到Mean值。然后使用以下公式,把Mean值从Gamma空间转换到Linear空间:
Indirect Multiplier = (Mean/255)2.2

这样可以得到光线的平均Indirect Multiplier的起始数值。例如:平均值为121会得到Indirect Multiplier为0.2。和默认值1.0相比,它会提供更为逼真的间接光照。
如下图所示,左侧Indirect Multiplier为1.0,右侧为0.2。

但是这种方法不会考虑光照设备的光照方向性,因此根据光照设备的结构,倍数需要进一步调整。

最大平滑度

在实时图像中,聚光灯和点光源通常为无限小,它们会从空间的一个点发射光线。这样对性能来说非常高效,却不逼真,经常在光滑表面上产生不自然的清晰镜面高光。

为了减轻该问题的影响,HDRP光线提供Max Smoothness(最大平滑度)设置,用于模拟较大的光源。如果材质受到Max Smoothness较小的光线影响,会显得比较粗糙,从而给人光源较大的感觉。
如下图所示,左侧Max Smoothness为1.0,会看见镜面高光过于清晰。右侧为0.65,镜面高光更符合光照效果。

阴影

我们可以同时启用实时和烘焙遮罩的阴影,以便动态游戏对象投射实时阴影,而且烘焙遮罩也能实现柔和的静态阴影。
点光源的实时阴影比聚光灯阴影消耗的资源更多,而烘焙遮罩则非常高效。
在使用实时阴影时,查看光线的检视窗口,调整Shadow Near Plane(阴影附近平面)以避免光照设备几何体出现阴影剪裁现象。
下图展示了当附近平面和光照设备几何体剪裁时的可见伪影。

默认阴影过滤也可以产生不真实的清晰实时阴影,特别是在使用高分辨率阴影的时候。

相比而言,烘焙遮罩会提供更真实的阴影,而且消耗的资源更少。

HDRP为实时阴影提供高质量过滤模式,但它会占用大量资源,因此应该只在高端机器上使用该模式。
如下图所示,左侧仅使用实时阴影,阴影分辨率为1024。中间仅使用实时阴影,阴影分辨率为4096。右侧仅使用光线遮罩,遮罩分辨率为512。

启用高质量过滤模式,选择HDRP资源,把Rendering Mode切换为Forward,并在Shadow部分把过滤质量设为High。

这样会在光线的检视窗口显示更多采样参数,以便我们调整阴影的柔和度和质量。

光线图层

在特定环境下,光线遮罩对光照设备产生负面的视觉效果,例如:不合适的自阴影或透光率影响。
在Unity中使用HDRP时,我们可以决定哪个游戏对象会从指定光源接收光线。该系统称为光线图层(Light Layers)。
启用该功能,选择HDRP资源,在Render Pipeline Supported Features部分中启用LightLayers。我们可以使用它来确保光线遮罩不会影响光照设备的特定部分。

在下面的示例中,灯泡被指定到单独的光线图层,因此它不会从主要光线遮罩中接收光照作用。
为了还原灯泡上的透光率,我们会在灯泡内放置较小的点光源,并把点光源指定到和灯泡相同的光线图层。

如下图所示,左侧为默认设置,光线遮罩对灯泡几何体产生不正确的效果。中间为设置为“Light Layer 1”的灯泡,当指定灯泡到特定光线图层时,光线遮罩不再产生影响。
右侧为设置为“Light Layer 1”的新光线,当指定新的点光源到和灯泡相同的光线图层时,灯泡会得到正确的光照。

最后,使用专用的点光源控制灯泡光照,特别在光照设备可以动态地关闭或销毁时特别有效。
下图中二个台灯预制件完全相同,但右边的台灯灯光已被禁用。由于灯泡和灯罩上使用了半透明材质,它们都能正确的展现灯光。

这种方法很合适,因为它通过实际光线游戏对象来模拟光的传输,而不是使用灯泡和灯罩材质中的任意发射率。
通常在游戏中,灯的网格或材质必须在运行时交换为非发光网格或材质。这个过程并不高效,并且可能会在交换过程发生视觉问题。因此在性能和实用性方面,仅使用光线游戏对象更为高效。

小结

在本篇文章中,我们重点讲述Unity中导入遮罩和进行光照设置。在下一篇中,我们将分享如何设置光照环境中的材质。
希望你能通过这篇文章学习到许多知识,学会创作高质量的Unity场景光照效果。


版权所有:Unity China
原文地址:在Unity中制作高质量的光照效果(中)

Last modification:July 3rd, 2019 at 10:36 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment


Notice: A non well formed numeric value encountered in /www/wwwroot/xians.me/usr/plugins/BackToTop/Plugin.php on line 83