本篇专家指南将介绍在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场景的视觉效果。