本篇专家指南将介绍在 Unity 中制作高质量光照效果的多种高级方法,其中使用了 2D 和立方体贴图的光线遮罩,并且利用了 Unity 高清渲染管线 HDRP 中的高级着色器。
我们可以在游戏、建筑可视化、电影和模拟项目中使用本指南介绍的工作流程。
概述
光线遮罩(Light Cookie)是用于遮挡部分光源的遮罩,以控制发射的光线形状。它们也可以被称为 “遮光片”,“剪影” 或“标识”,所用的名称取决于应用行业和具体用例。
目前的实时渲染引擎无法渲染光照设备产生的所有复杂阴影细节,它们无法有效地为低端平台产生基于光线跟踪的柔和阴影,更不用说清晰的折射焦散效果。而用户生成的遮罩可以更好地控制阴影,并在光照中添加创意细节。
此外,实时点光源阴影对于现在的硬件来说仍是性能上的难题,因此制作带有大量阴影投射点光源的环境依旧是一项挑战。这就是为什么烘焙光线遮罩对生成实时应用的高质量光照至关重要的原因。
常见的光照问题
在实时应用程序中,光源经常依靠发光的,无细节的 “斑点” 来模拟它们的发光部分。
如果小心地进行制作,这种方法是制作高性能光照的可接受方法,特别是在处理低端平台的时候。但是,包括 AAA 级游戏在内的许多 PC 和主机项目经常无法制作出逼真的光源。
首先,当我们调整 Unity 中的光照和材质时,需要确保发光表面的颜色准确符合光线效果,因为明眼人能马上注意到发射器和光照效果在颜色上的差异。
我们可以使用 Unity 颜色选取器中的样本来保存预定义的色温,以避免过多的颜色多样性。我们也可以把颜色样本保存为资源,分享给团队成员。颜色的数值或亮度应为 100%,因为我们应该仅通过 Intensity 属性而不是光线颜色,来处理光线强度。
另一个常见问题是缺乏发光强度和光照效果之间的一致性。这个问题导致非常明显的光线泄露,特别是镜面光泄露现象,它会立刻破坏场景的逼真度。如果缺乏写实的阴影或光线遮罩,该问题的影响会更明显。
如下图所示,左侧图片发光部分和光照效果存在差异,而右侧图片的发光源和光照效果更为逼真。
日光灯管的光线也是一项重大挑战,因为这类光线需要许多光照特性才能让人有真实的感觉,例如:柔和阴影、线形或胶囊体光源、以及镜面粗糙度重写。
如下图所示,左侧图片的日光灯缺少自阴影,而右侧图片对比出来自日光灯反射板的逼真光线遮蔽。
Unity HDRP 高清渲染管线可以解决前面提到的大部分难题,允许我们以最小的性能负担模拟出灯管效果。
发光部分通常显得不真实,添加合适的几何体和纹理细节可以大幅提升逼真度,灯罩上柔和光线衰减和灯泡的光亮也会有很大影响。
HDRP 高清晰渲染管线提供基于物理的着色器,可以处理透明度、半透明度、透光率、折射率和扭曲度,模拟出不同表面的光线。例如:半透明灯罩、金属反射板和磨砂玻璃。
如下图所示,左侧图片缺少发光细节和自阴影,而右侧图片有更为逼真的自遮蔽和柔和的半透明度。
创建遮罩
下面讲解如何使用离线渲染技术来采集 2D 纹理和立方体贴图中的光照和阴影。这部分示例所使用的工具有 Photoshop、3ds Max 和 Unity。
你可以使用其它图像处理程序和 3D 工具来生成纹理,唯一的要求是:用于烘焙立方体贴图的渲染器必须支持纹理烘焙的形式。
例如:Nvidia 的 Iray 和 Autodesk 的 Quicksilver 渲染器不支持 “Render to Texture”(渲染为纹理)功能,该功能可以使用 3ds Max 轻松烘焙立方体贴图,Arnold、V-Ray、Corona 和已弃用的 Mental Ray 均支持该功能。
1
2D 纹理遮罩
为聚光灯生成 2D 遮罩是一项相对简单的任务,它可以彻底改善 Unity 中默认聚光灯的效果。
HDRP 高清渲染管线接受有色遮罩,内置渲染管线只接受灰度遮罩。因此我们可以利用 HDRP 高清渲染管线的功能,添加少量彩色边缘效果和折射效果到遮罩上。
如下图所示,左侧是 Unity 默认的聚光灯效果,而右侧则是自定义制作拥有 2D 遮罩效果的光照环境。
我们可以用模糊滤镜、调整滤镜、渐变和纹理效果,来制作出具有精致细节的遮罩。
制作家用聚光台灯的有效工作流程是,使用径向模糊来制作圆形和非对称形状,然后使用颜色渐变滤镜来生成径向衰减和更清晰的彩色细节。
最后,关键在于确保纹理边缘是 100% 的黑色,以避免在使用基于物理的光线强度时,光线体积边缘出现明显的剪裁现象。
如下图所示,依次是随机图案、径向模糊、径向颜色渐变、径向衰减的效果。
2
立方体贴图遮罩(3ds Max 和 Arnold)
单位设置
首先,在 DCC 工具中指定正确的单位。例如:在 3ds Max 的 Customize > Unit Setup… > System Unit Setup 选项下,确保设置 1 unit = 1.0 Meter,这样在对象导入 Unity 时会有正确的大小。
在使用基于物理的渲染器时,这一点极为重要。例如:Unity HDRP 高清渲染管线会把 1 个单位视作 1 米,该设置对光线传播和场景外观会产生巨大影响。
烘焙球体
对于这一部分,我们提供已设置好的 MAX 格式文件,它带有光照设备的烘焙球体。
请下载 WallLamp.max 文件,你可以使用这个文件作为起点来尝试使用 Arnold 渲染器。
WallLamp.max 文件下载地址:
https://drive.google.com/file/d/1Yb6JTuBKafLLjUO49OLxtYR-2YhTHibp/view
如果想手动创建球体,请按照下面的步骤创建:
- 创建立方体,把它转换为 Editable Poly 可编辑多边形。
- 应用 Normal 修改器来确保法线面向内部。在对象的属性中禁用背面剔除,以查看立方体的内部。
- 应用 TurboSmooth 修改器,3 次以上迭代或 Quadify Mesh 修改器来确保立方体为下一步进行足够的细分。
- 应用 “Spherify” 修改器来把网格约束为完美球体。这样立方体贴图不会有任何的变形现象。
- 分离每个面,重命名各个面的名称为 Top、Bottom、Left、Right、Back 和 Front。
- 因为我们从立方体开始,所以 UV 展开应该已经很完美,我们也可以再次检查每个面是否覆盖整个 UV 空间,范围从[0,0]到[1,1]。
Arnold 材质
为了实现遮罩的最高渲染质量,指定 Arnold 的物理材质到光照设备上。
这部分的重要参数如下图所示。
- Base color 基本颜色
该属性定义材质颜色,包括金属材质。我们也可以使用镜面颜色为金属或复杂表面产生边缘着色。我们主要在此采集漫反射光线和阴影,因此该参数只有在处理间接光照时才比较重要,它会给阴影加入轻微的着色。 - Roughness Roughness 粗糙度
该属性控制材质的光滑程度。当该值设为 1 时,效果和镜子完全一样。 - Transmission 透光率
该属性定义穿透材质的光线量。数值越大,材质越透明也越清晰。我们可以使用该值来模拟半透明的灯罩和玻璃。 - Emission 自发光
该属性控制表面的自发射光线总量。通常,把光线指定到网格更为高效,可提供更短的渲染时间,并得到较少视觉噪声的渲染结果。
Arnold 光线
Arnold 在渲染球体期间,会无视 3ds Max 光线,所以我们必须使用 Arnold 光线来生成光线。
我们无法通过 FBX 格式导出 Arnold 光线,因此我们应该把标准 3ds Max 光线附加到光照设备上。我们可以通过 FBX 格式导出 3ds Max 光线,而且 Unity 可以正确地使用这些光线。
这样可以为光线游戏对象提供正确的 Transform 设置,因此我们不必在 Unity 调整光线遮罩的朝向。
Arnold 光线的关键参数有:Type(类型)、Color(颜色)、Intensity(光强度)、Exposure(曝光值)、Samples(采样)。
白色像素应该出现在遮罩的未遮蔽部分。如果这些像素显示为灰色,我们需要稍微提高 Arnold 光线的 Intensity 或 Exposure 值。
请小心地进行修改,以避免过度曝光遮罩。如果 Arnold 光线强度太高,柔和阴影可能会被覆盖,并丢失细节。如果想完全调整 Unity 中的光线颜色,请使用纯白色的光线颜色。
Samples 值控制直接光线的噪声和光线产生的柔和阴影。Samples 值越大,噪声越少,但会需要更长的渲染时间,4 次以上高采样次数结合 Arnold 设置的合适滤镜可以产生几乎无噪声的结果。
如下图所示,Contribution 面板上的参数可以帮助我们实现更快的烘焙,并正确地平衡遮罩。
首先,我们应该禁用 “Specular” 的作用,因为烘焙球体只是为了采集直接或漫反射光照。
此外,如果使用 Unity 场景中的全局光照,我们可以降低或完全禁用 Indirect 值。这样会在烘焙后的遮罩得到更深更暗的阴影,而且 Indirect 值设为 0 的话会大幅减少渲染时间。
阴影和半阴影柔和度
与许多离线渲染器一样,Arnold 提供指定光线到网格的功能,这要归功于 “Mesh” 光线类型。它会产生基于物理的阴影模糊和半阴影效果。通常,这种网格会成为灯泡或火焰的发光部分。
在现实中,由光源产生的阴影经常比预期的扩散程度更大或更模糊。为了从艺术上保留阴影细节,我们可以使用点光源或柱形光源,而不用网格光源。
为了控制半阴影的柔和度,请修改点光源的 Radius(半径):半径越小,阴影越清晰。如下图所示,从左至右 Arnold 点光源的半径变化和效果:
- 当半径为 0 时候,没有半阴影,只会存在图案一样不逼真的 “类游戏” 阴影。
- 当半径为 1 厘米,会有具有艺术感的半阴影,带有柔和阴影和保留的阴影细节。
- 当半径为 2.5 厘米,会有基于物理的半阴影,有大量 “丢失的” 阴影细节。
我们需要反复试验才能找到阴影清晰度和物理准确性之间的平衡,因为不自然的清晰阴影看起来很奇怪。相对于点光源和柱形光等类型,网格光会产生较弱的光照。
光源和球体之间的距离也会影响阴影的柔和度。球体的距离越近,阴影越清晰。因此我们需要调整球体的大小,使它表现出光源和其它阴影接收者之间的通常距离。
如下图所示,左侧为球体直径为 1 米,右侧为 5 米,不同的效果图。
在重新调整球体大小时,我们也需要调整 Arnold 光线的强度或曝光度,以适应光照的物理平方反比衰减。简单来说,越大的球体需要越高的光线强度,以确保遮罩的未遮蔽部分为白色。
自阴影
我们需要考虑的一个重要因素是,在烘焙期间光照设备的自阴影效果。我们应该隐藏台灯上不相关的大型遮蔽元素,它们会对道具自身的光照产生负面影响。
如下图所示,左侧图片中光线遮罩在支撑臂和台灯底座投射了不自然的阴影。右侧图片光线遮罩没有在支撑臂和台灯底座投射不必要阴影,拥有更好的自阴影效果。
在本示例中,我们通过使用通过 3ds Max 中的 Tools > Layer Explorer… 选项,把圆形支撑元素和灯泡在渲染时隐藏了起来。在 Layer Explorer 中,单击茶壶图标可以使相应对象在烘焙时保持隐藏状态。
Render to Texture 设置
首先,选择 6 个面的分组,然后单击 0,打开 Render to Texture 对话框。对象会出现在对话框中间的列表中。
如果使用了 Unity 的示例 MAX 文件,即 WallLamp.max,球体已经可以渲染。图像会输出到预定输出路径。我们应该修改每个面的渲染路径,使其符合项目的文件夹结构。
我们切换为 Individual 模型,修改输出路径。
为了快速设置渲染器和 Arnold,加载 Unity 的预设置,我们提供了 Render Presets 渲染预设置,请访问:
https://drive.google.com/drive/folders/1ZQob77_wLfDYYxrUP8nrYw3spDcEaPl2?usp=sharing
我们可以通过 Render Settings 渲染设置面板的下拉列表加载预设置。它们会根据所选预设置提供不同的噪声量。
对于本文展示的多数渲染器而言,Camera (AA) 采样非常重要。如果台灯使用透光率,我们需要更多采样给间接和透光属性。
如下图所示,左侧 ArnoldRenderToCookie,渲染约 2 分钟,而右侧 ArnoldRenderToCookieDraft,则少于 20 秒。
如果不使用我们提供的渲染预设置,则需要考虑的参数是图像滤镜,它位于 Setup > Arnold Renderer > Filtering。
你可能希望使用半径较大的默认高斯滤镜,以减少渲染图像中的噪声。但是非常大的宽度值会产生轻微的边缘瑕疵,并产生立方体贴图上的明显缝隙。
如下图所示,高斯滤镜宽度左侧为为 4,右侧为 10 的不同效果。
下面的立方体贴图使用了最大高斯滤镜宽度 10 进行渲染,以突出显示缝隙。
Unity 可以减少或完全修复瑕疵,只要打开纹理的导入设置,并勾选 Fixup Edge Seams 即可。
现在,移动到 Render to Texture 窗口底部,单击 Render,帧会保存在输出文件夹。
IES 光线
Arnold 光线不支持光度学的 IES 光线,因此我们可以把它们渲染到 2D 纹理或立方体贴图遮罩中。
选择 Photometric 光线类型,找到电脑中的 IES 文件。
可以用简单聚光灯展示的 IES 光线可以烘焙到平面上。IES 向所有方向发射的光线需要用球体烘焙,以生成立方体贴图。
请注意,大多数 IES 配置文件不存储大量角度信息。每个角度的数据量通常受到限制,这样会在实际情况中产生模糊的遮罩。
我们可以决定重新自定义创建遮罩,或者导入烘焙的 IES 纹理到 Photoshop 或 Substance Painter 中,然后添加更清晰的纹理和颜色。
模型导出
在 DCC 工具完成台灯的 3D 模型后,我们将其导出为 FBX 格式文件。
请确保导出 Smoothing Groups(平滑组)和 Lights(光线),并取消勾选 TurboSmooth,以免想要根据 TurboSmooth 修改器设置对网格进行细分。
勾选 TurboSmooth 意味着,在实际使用中,Unity 不会显示高度细分的网格,因为它不会识别 TurboSmooth 修改器,无法在资源导入时重新细分网格。
请注意,3ds Max 使用的坐标轴系统和 Unity 不同。在 3ds Max 中,上轴为 Z 轴,在 Unity 中为 Y 轴,这会使父游戏对象的 X 轴有 - 90 度的旋转角度。
Photoshop 设置
如果想把所有面结合到 6*1 的立方体贴图中,可以直接把它导入到 Unity,并应用到光线对象上,立方体贴图的面会不正确地显示。例如:它们可能进行旋转或翻转,这是因为 Unity 认为这些面会以特定方向映射。
解决此问题的方法是,使用 Photoshop 和带文件链接的 Smart Objects,来自动处理表面方向和立方体贴图创建。这意味着我们不必使用耗费资源的 UV 展开来处理,因为球体上有反转法线。
我们在供了已为 Unity 设置好的 Photoshop 文件,请下载 WallLampCookie1024.psd:
https://drive.google.com/file/d/1-vK3p3Ld6aYoTxLy1GRjyHj-hdrOk8OR/view?usp=sharing
每个面都被调整到正确的方向,这样就不必自己处理这部分工作。
如果这些面没有存在 Photoshop 预期的磁盘位置,图层缩略图会显示红色图标。要恢复图片的链接,请右键单击每个图像,然后选择 Relink to File…。
无论什么时候重新渲染球体,Photoshop 都会自动更新立方体贴图。Photoshop 会在 PSD 保存当前的面,因此要是对新渲染的面不够满意,可以撤销自动更新结果。
请不要旋转,移动或翻转这些面。这样做会在 Unity 处理立方体贴图时,对其造成破坏。
3
立方体贴图遮罩(Unity 渐进式光照贴图)
Unity 的渐进式光照贴图也可以用于生成立方体贴图遮罩。设置过程需要烘焙球体,并使用反射探针来生成 HDR 立方体贴图。在编辑完成后,该立方体贴图可用于光线遮罩。
烘焙设置
我们把台灯放到有朝内法线的球体中,给所有投射阴影和接收光线的几何体添加 Lightmap Static 标签,这样光照贴图会在烘焙时考虑这些几何体。然后指定所有必要 Unity 材质到球体和道具上。
然后点击菜单 Window > Rendering > Lighting Settings,启用 Baked Global Illumination。
我们将台灯内光线游戏对象的模式设为 Baked,把光线的 Indirect Multiplier 设为 0,使它只获取直接光照。调整 Baked Shadow Radius,使它模拟较大光源,并创建柔和阴影。
然后根据需求调整光照贴图设置。下图的 Lightmapping Settings 设置在高端笔记本电脑上为一个球体生成光照的时间在 30 秒以内。
你可以考虑把 Lightmap Resolution 提高到 1024,以用于产品渲染,获得尽可能多的细节。请注意,这样的缺点是会提高烘焙时间。
选择 Generate Lighting。Unity 会把光照烘焙到球体。
在球体中添加反射探针,确保其 Near Clip 保留在球体中。
为台灯创建图层遮罩,让台灯对探针保持不可见状态。这样我们不必在迭代时调整台灯的可见性。
指定台灯到新的图层遮罩,然后在探针的检视窗口中,在 Culling Mask 下拉列表禁用探针所属的图层。
再次生成光照,探针会获取光照信息。探针的分辨率在 HDRP 资源中有全局设置。
最后在 Photoshop 打开 EXR 反射文件,应用 Exposure 调整图层来调整纹理。
Unity 需要 8 位遮罩,因此把颜色模式从 32 位降低为 8 位,以减小文件大小。
渐进式光照贴图的限制
相较于使用 3D 工具和离线渲染器的离线工作流程,Unity 渐进式光照贴图的遮罩烘焙工作流程有多次绘图调用。
目前,我们只建议使用渐进式光照贴图处理主要部分为不透明材质的简单光照设备,它不适合制作具有高级材质特性的精致光照设备。
在 DCC 工具中渲染立方体贴图的优点有:
- 模型已经制作好,它可以使用自带材质进行渲染,不会影响 Unity 的模型或材质。
- 几何体可以使用高级修改器,例如 TurboSmooth 进行离线渲染,以制作非常平滑的阴影,且不必在 Unity 导入密集的网格。
- DCC 工具通常有专用工具把对象渲染到贴图上,而且会自动处理烘焙过程。
- 离线渲染器可以在很短的时间内创建无噪声纹理。
光线和材质
在 Unity 中,特定类型光线无法投射阴影,例如:线条光。这意味着烘焙灯管的遮罩需要更多处理,因为它要使用一组阴影投射点光源作为处理方法。
渐进式光照贴图不支持多数 HDRP 的高级着色器,例如:有色半透明效果和折射效果。这意味着我们需要为烘焙过程创建独立的材质组,可能也需要烘焙专用的预制件。
为了模拟灯罩的半透明效果,我们把它的材质从不透明着色器转换为半透明着色器,这样可以让渐进式光照贴图的光线透过灯罩。
如下图所示,左侧为使用不透明的半透明材质渲染的渐进式光照贴图,右侧为使用半透明标准材质渲染的渐进式光照贴图。
Unity 材质中半透明效果的颜色不会影响阴影颜色。我们可以通过有色光模拟彩色透光效果,但这样会对未遮蔽光照进行着色。
我们也可以生成二个立方体贴图,一个带有着色光线,另一个没有,然后在 Photoshop 组合立方体贴图,但这会过程冗长且符合实际。
我们可以使用发射功能来解决。发射功能不需要大量间接采样来实现可接受的效果,我们需要把 Bounce 值,在 Lightmapping Settings 中设为 1。这样会提高烘焙时间,在强力 CPU 上会花费数小时,而 Arnold 渲染器仅需数秒就可以用网格光线模拟相同的效果。
如下图所示,发光火焰,2 万个间接采样,每米有 512 个体素,花费时间约 20 分钟。左侧为没有滤镜,右侧为有高斯滤镜。
缝隙
通常在提高 Shadow Baking Radius(阴影烘焙半径)并使用间接光线反弹时,会在画面中看到缝隙。
条带效应
Unity 通过反射探针获取遮罩,此时会发生条带效应,特别是在处理光强度很低的发光道具时。我们建议使用较高光强度的放大器,以避免精度误差。
相比之下,Arnold 渲染器可以产生近乎完美的遮罩,没有任何明显的瑕疵。
如下图所示,左侧为反射探针 EXR 光源,中间为渐进式光照贴图的引擎内结果,寻在可见的条带效应,右侧为 Arnold 的渲染后结果,效果非常完美。
如果条带效应的问题仍然存在,我们也可以从光照贴图提取各个面,然后把它们重新结合到立方体贴图中。
小结
在本篇文章中,我们梳理了常见光照问题,并且学习使用 2D 纹理、立方体贴图创建遮罩。在下一篇中,我们将重点讲述 Unity 中导入遮罩和进行光照设置。
希望你能通过这篇文章学习到许多知识,学会烘焙出逼真光线遮罩,并提高 Unity 场景的视觉效果。
更多 Unity 精彩技术经验分享和谈论,尽在 Unity Connect 平台 (Connect.unity.com)
推荐阅读
- 在 Unity 中制作逼真的建筑场景
- 在 Unity 中实现逼真的下雨效果
- Unity 2018 中的渐进光照贴图
- 揭秘 ADAM | 光照的使用技巧和经验
- 使用 Unity 创作逼真的 VR 视觉体验5
- Visual Effect Graph 示例项目
- 米哈游:《八重樱 · 桃源恋歌》短片制作技术分享
官方活动
Unity GDC 2019 活动日程
GDC 2019 正在旧金山举行,欢迎现场的朋友来到#227 展位,了解 Unity 活动日程信息,请点击此处。
Unity GDC 2019 官网:
Unity 技术分享日-深圳站报名开启
3 月 29 日,我们将来到深圳举办 Unity 技术分享日,分享 Unity 最新的前沿技术,以及 Unity 官方技术专家团队一对一的项目诊断。[了解详情…]
报名截至时间:3 月 29 日
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=2247497554&idx=1&sn=9f6ccfb0e35d93e85b019e72074884ae&chksm=fe1dc3f9c96a4aefae44d30bb82bcb63cf93bee5c3dd02b31caab5d0e6c9d0e655b219e10dcc&scene=4