本专家指南将介绍在 Unity 中制作高质量光照效果的多种高级方法,其中使用了 2D 和立方体贴图的光线遮罩,并且利用了 Unity 高清渲染管线 HDRP 中的高级着色器。
在Unity中制作高质量的光照效果(上)中,我们梳理了常见光照问题,学习使用 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 精彩技术经验分享和谈论,尽在 Unity Connect 平台 (Connect.unity.com)
推荐阅读
- 在 Unity 中制作高质量的光照效果(上)
- 米哈游:《八重樱 · 桃源恋歌》短片制作技术分享
- Unity 2018 中的渐进光照贴图
- AMD Radeon Rays 将集成到 Unity 的 GPU 渐进式光照贴图系统
- SRP Batcher:加速渲染
- 《暗影格斗 3》中的渲染优化
- Unite Shanghai 2019 技术演讲部分内容曝光
- Unity GDC 2019 Keynote 精彩要点:次世代图形、实时光线追踪、DOTS
官方活动
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 Connect
https://mp.weixin.qq.com/s?__biz=MzU5MjQ1NTEwOA==&mid=2247497631&idx=1&sn=49a61adaaa5a7e293db7d8c7644e6ffd&chksm=fe1dc334c96a4a223dfe57caab96718b9ba1edbd6af3e889d4e91fc5790c622f2eaca2886b11&scene=4