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

    在Unity中制作高质量的光照效果(上)中,我们梳理了常见光照问题,学习使用 2D 纹理,立方体贴图创建遮罩。在本篇中,我们将分享如何在 Unity 中导入遮罩和进行光照设置

    遮罩导入

    我们将立方体贴图导出到 Asset 文件夹。如果磁盘空间、传输速度、资源大小和处理时间都是重要参数,那么请避免在 Asset 文件夹保存较大的 PSD 源文件。

    如果使用默认内置渲染管线,请使用以下纹理设置。纹理是 2D 贴图时,把 Light Type 设为 Spot;纹理是立方体贴图时,把 Light Type 设为 Point。

    在Unity中制作高质量的光照效果(中) - 图1

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

    在Unity中制作高质量的光照效果(中) - 图2

    我们可以手动调整每个纹理的分辨率,尽量减小纹理的大小以减少其内存占用,特别是处理立方体贴图时,这类贴图通常比普通 2D 遮罩大 6 倍。

    128 到 512 个遮罩通常可以提供足够的细节,对于仅运行在高端电脑的项目而言,该参数的影响性较小。

    在Unity中制作高质量的光照效果(中) - 图3

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

    在Unity中制作高质量的光照效果(中) - 图4

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

    在Unity中制作高质量的光照效果(中) - 图5

    光照设置

    高清晰渲染管线 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中制作高质量的光照效果(中) - 图6

    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 显示器、手机屏幕等。

    没有色调映射或中度色调映射的图像,通常会在屏幕上显示受限的高光瑕疵。

    在Unity中制作高质量的光照效果(中) - 图7

    现今色调映射的工业标准基于学院色彩编码系统(ACES)。从视觉效果上看,这种技术允许我们模拟电影的光照反馈,明亮的像素会向不饱和的白色聚集,产生不美观的 “线性” 效果,这种情况常见于早期的游戏中。

    去饱和处理对保持明亮受光材质的最佳着色很重要,因此在处理强烈的发光材质和高对比度光照时也特别重要。

    在Unity中制作高质量的光照效果(中) - 图8

    ACES 色调映射可以加入更强烈的对比度,特别是使用 Neutral 色调映射调整光照时,这种色调映射默认产生比较有平面感的视觉效果。

    使用 ACES 时,我们可以使用 Contrast 或 Gamma 滑块等参数,自然地降低对比度并提高中间色调。

    如下图所示,左侧 Neutral tone 色调映射,高光的饱和度过高,整体图像比较平面感。右侧 ACES 色调映射,高光向白色聚集,光照反应更加逼真。

    在Unity中制作高质量的光照效果(中) - 图9

    屏幕空间环境遮蔽(SSAO)

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

    在Unity中制作高质量的光照效果(中) - 图10

    后期处理的环境遮蔽效果在有机的嘈杂环境中非常高效,但是在具有清晰材质和平坦硬面的高质量渲染环境中,它会产生不理想的伪影,例如:小型对象周围的黑暗角落和光环效果。

    如下图所示效果,从左至右 SSAO 的强度分别为 0.0、0.5、1.0。

    在Unity中制作高质量的光照效果(中) - 图11

    发射率

    对于光照设备的发光表面,要使用专用的发光纹理,而不是平面的发光 HDR 颜色。

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

    在Unity中制作高质量的光照效果(中) - 图12

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

    在Unity中制作高质量的光照效果(中) - 图13

    光线强度单位

    现实中,灯泡和光照系统的强度会用不同单位表示,这取决于应用行业和制造商。Unity 会根据具体的工作流程提供不同的单位。

    在高清晰渲染管线 HDRP 中,严格的光强度由流明(Lumen)、坎德拉(Candela)、x 米的勒克斯(Lux at x Meter)和 EV 进行定义。

    流明(lm)定义了光源产生的光通量,它表示可以离开光源的光线总量。如果把光线比作液体,流明就对应流速。

    为了衡量灯泡或台灯的光输出总量,被测光照设备会放在积分球测试仪中,积分球内表面有反射性的白色涂层,检测器会衡量球体中的漫反射光照。

    因此流明不会提供任何关于光照设备的定向信息,流明单位常用于模拟朝所有方向发射等量光线的球形光,而不是朝某个方向发射的光。

    例如,如果模拟 800 lm 的常见灯泡,我们可以把光线游戏对象的 Intensity 设为 800。然而,如果在灯泡旁放置灯罩,假设在 Unity 中灯罩不会投射阴影,则附近表面接收的光照会太强,因为场景的灯罩不会实时遮蔽光照。

    如下图所示,左侧为 800lm 的光照效果,我们可以看见墙体受程度太强。右侧模拟灯罩遮蔽的 400 lm 投射到墙上的光,会显得更为逼真。

    在Unity中制作高质量的光照效果(中) - 图14

    在处理聚光灯等集中的光照时,我们需要仔细考虑流明单位。根据定义,流明不会指定光照的方向。

    如果模拟规格为 1200 lm 和最大角度为 110 度的聚光灯,我们需要在光线对象的检视窗口启用 Reflector,从而接收集中光照的正确光量。

    在Unity中制作高质量的光照效果(中) - 图15

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

    在Unity中制作高质量的光照效果(中) - 图16

    启用 Reflector 时,如果光束变窄,接触表面的光线量会增加。如果光束变宽,接触表面的光线量会减少。

    如下图光照场景效果,启用了用 Reflector,左侧聚光灯角度为 135 度,右侧为 20 度。

    在Unity中制作高质量的光照效果(中) - 图17

    坎德拉(cd)是一种更直观的测量单位,它定义了从特定角度观测的光强度。1cd 大概等于 1 个 “烛光” 单位,这是标准蜡烛的亮度。

    如果我们站在光照设备的完整阴影下,我们观察的结果几乎为 0cd。如果站在最亮的区域,我们会测量到数百坎德拉。重点的是要注意和光照设备的距离不会产生影响。

    IES 光线配置文件使用坎德拉来定义光照周围多个角度的光强度。Unity 不支持 IES 文件格式,但我们可以把它们烘焙到 2D 或立方体贴图遮罩中。

    在光照设备制造商说明产品产生的坎德拉量时,通常仅提供从最佳角度测量的最大光强度。对于 3000cd 的家庭聚光灯,最佳位置会在灯光投射的中间部分,对于老式 8cd 的煤气灯,最佳位置则在灯的侧面。

    X 米的勒克斯(Lux at x meters)定义了表面在距光源的特定距离处接收的光量,这种类型的测量在模拟专业电影光照时特别实用。专业聚光灯和泛光灯的规格通常包含任意距离的勒克斯测量结果。

    在为室内和室外环境设计照明时,建筑师、设计师和工程师会使用以勒克斯为单位的推荐亮度等级。例如,公路隧道通常需要至少 20 勒克斯的光量,家用厨房需要 150 勒克斯,在工程实验室中使用复杂机械时,2000 勒克斯是要求的最低光量。

    色温

    Unity 提供二种颜色模型,以实现最大灵活度。请启用 Color temperature 来处理白炽灯模型,单位为开尔文。我们可以使用额外的颜色滤镜来模拟不同光照效果,例如:彩色玻璃,反射板和彩色胶体。

    由于 Unity 缺乏自动白平衡功能,在特定情况下,使用基于物理的色温模型会产生不自然的暖色饱和的光照。这意味着白炽灯的灯光在颜色校正前通常看起来不真实。

    在Unity中制作高质量的光照效果(中) - 图18

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

    在Unity中制作高质量的光照效果(中) - 图19

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

    在Unity中制作高质量的光照效果(中) - 图20

    和真实照片或摄像机一样,如果使用了错误的自动白平衡预设,例如白炽灯而不是日光灯,那么颜色会很难改变。

    下面图像展示的灯管使用了较冷的颜色,5000 开尔文的色温,通过 LUT 或 Unity 的颜色分级工具,在 Unity 中钨丝灯风格的颜色校正实现白平衡。左侧的效果更为真实,右侧的色温则过低。

    在Unity中制作高质量的光照效果(中) - 图21

    使用基于体积或根据摄像机的颜色分级可以减少这些实际问题。在任何情况下,如果问题过于复杂,无法在环境中解决,我们都可以使用自选的颜色,特别是在环境包含各种光照类型的时候。

    本篇专家指南中展示的大多数光照设备,我们使用了精心挑选的颜色,而不是开尔文色温。这展示了物理准确性和艺术自由度之间的冲突,以及无法使用管线的特定部分时,基于现实的工作流程会如何提高复杂度。

    间接倍数

    通过烘焙全局光照或实时全局光照解决方案烘焙光线时,Unity 不支持遮罩。因此,在使用包含大量遮蔽的立方体贴图遮罩时,Unity 场景经常会生成过多间接光照。

    以下管形灯的顶部,即立方体贴图第六个面,存在很强的遮蔽。

    在Unity中制作高质量的光照效果(中) - 图22

    为了解决此问题,我们需要减小光线游戏对象的 Indirect Multiplier(间接倍数)。找到满意的 Indirect Multiplier 值的方法是,观察遮罩的平均亮度。

    在 Photoshop 中,打开直方图工具,找到 Mean 值。然后使用以下公式,把 Mean 值从 Gamma 空间转换到 Linear 空间:

    Indirect Multiplier = (Mean/255)2.2

    在Unity中制作高质量的光照效果(中) - 图23

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

    如下图所示,左侧 Indirect Multiplier 为 1.0,右侧为 0.2。

    在Unity中制作高质量的光照效果(中) - 图24

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

    最大平滑度

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

    在Unity中制作高质量的光照效果(中) - 图25

    为了减轻该问题的影响,HDRP 光线提供 Max Smoothness(最大平滑度)设置,用于模拟较大的光源。如果材质受到 Max Smoothness 较小的光线影响,会显得比较粗糙,从而给人光源较大的感觉。

    如下图所示,左侧 Max Smoothness 为 1.0,会看见镜面高光过于清晰。右侧为 0.65,镜面高光更符合光照效果。

    在Unity中制作高质量的光照效果(中) - 图26

    阴影

    我们可以同时启用实时和烘焙遮罩的阴影,以便动态游戏对象投射实时阴影,而且烘焙遮罩也能实现柔和的静态阴影。

    点光源的实时阴影比聚光灯阴影消耗的资源更多,而烘焙遮罩则非常高效。

    在使用实时阴影时,查看光线的检视窗口,调整 Shadow Near Plane(阴影附近平面)以避免光照设备几何体出现阴影剪裁现象。

    下图展示了当附近平面和光照设备几何体剪裁时的可见伪影。

    在Unity中制作高质量的光照效果(中) - 图27

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

    在Unity中制作高质量的光照效果(中) - 图28

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

    在Unity中制作高质量的光照效果(中) - 图29

    HDRP 为实时阴影提供高质量过滤模式,但它会占用大量资源,因此应该只在高端机器上使用该模式。

    如下图所示,左侧仅使用实时阴影,阴影分辨率为 1024。中间仅使用实时阴影,阴影分辨率为 4096。右侧仅使用光线遮罩,遮罩分辨率为 512。

    在Unity中制作高质量的光照效果(中) - 图30

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

    在Unity中制作高质量的光照效果(中) - 图31

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

    光线图层

    在特定环境下,光线遮罩对光照设备产生负面的视觉效果,例如:不合适的自阴影或透光率影响。

    在 Unity 中使用 HDRP 时,我们可以决定哪个游戏对象会从指定光源接收光线。该系统称为光线图层(Light Layers)。

    启用该功能,选择 HDRP 资源,在 Render Pipeline Supported Features 部分中启用 LightLayers。我们可以使用它来确保光线遮罩不会影响光照设备的特定部分。

    在Unity中制作高质量的光照效果(中) - 图32

    在下面的示例中,灯泡被指定到单独的光线图层,因此它不会从主要光线遮罩中接收光照作用。

    为了还原灯泡上的透光率,我们会在灯泡内放置较小的点光源,并把点光源指定到和灯泡相同的光线图层。

    在Unity中制作高质量的光照效果(中) - 图33

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

    右侧为设置为 “Light Layer 1” 的新光线,当指定新的点光源到和灯泡相同的光线图层时,灯泡会得到正确的光照。

    在Unity中制作高质量的光照效果(中) - 图34

    最后,使用专用的点光源控制灯泡光照,特别在光照设备可以动态地关闭或销毁时特别有效。

    下图中二个台灯预制件完全相同,但右边的台灯灯光已被禁用。由于灯泡和灯罩上使用了半透明材质,它们都能正确的展现灯光。

    在Unity中制作高质量的光照效果(中) - 图35

    这种方法很合适,因为它通过实际光线游戏对象来模拟光的传输,而不是使用灯泡和灯罩材质中的任意发射率。

    通常在游戏中,灯的网格或材质必须在运行时交换为非发光网格或材质。这个过程并不高效,并且可能会在交换过程发生视觉问题。因此在性能和实用性方面,仅使用光线游戏对象更为高效。

    小结

    在本篇文章中,我们重点讲述 Unity 中导入遮罩和进行光照设置。在下一篇中,我们将分享如何设置光照环境中的材质

    希望你能通过这篇文章学习到许多知识,学会创作高质量的 Unity 场景光照效果。

    更多 Unity 精彩技术经验分享和谈论,尽在 Unity Connect 平台 (Connect.unity.com)

    推荐阅读

    官方活动

    Unity GDC 2019 活动日程

    GDC 2019 正在旧金山举行,欢迎现场的朋友来到#227 展位,了解 Unity 活动日程信息,请点击此处

    Unity 技术分享日-深圳站报名开启

    3 月 29 日,我们将来到深圳举办 Unity 技术分享日,分享 Unity 最新的前沿技术,以及 Unity 官方技术专家团队一对一的项目诊断。[了解详情…

    报名地址:

    https://connect.unity.com/events/2019UnityShenZhenRS

    Unite Shanghai 2019

    5 月 10 日-12 日上海,Unite 大会强势回归。技术门票正在热销中,购票即获指定 Asset Store 资源商店精品 21 款资源的 5 折优惠券。

    购票请访问:Unite2019.csdn.net

    在Unity中制作高质量的光照效果(中) - 图36

    点击 “阅读原文” 访问 Unity Connect
    https://mp.weixin.qq.com/s?__biz=MzU5MjQ1NTEwOA==&mid=2247497631&idx=1&sn=49a61adaaa5a7e293db7d8c7644e6ffd&chksm=fe1dc334c96a4a223dfe57caab96718b9ba1edbd6af3e889d4e91fc5790c622f2eaca2886b11&scene=4