游戏中的光(二):实时3D艺术最佳实践-灯光

Cliff

2022-12-211259次浏览

0评论

17收藏

2点赞

分享

灯光是游戏最重要的部分之一。这是因为灯光可以设定心情,引导游戏玩法并确定威胁和目标。灯光会影响游戏的视觉效果。例如,简单的模型在良好的照明技术下在游戏中看起来会更好,反之如果模型在不好的照明下会看起来更糟。Unity游戏引擎使照明工作变得简单明了。游戏平台以及硬件的性能影响着照明技术,因此需要有效地使用灯光。


一、灯光模式

灯光有不同的模式。这些模式与灯光的移动性以及场景中的使用方式有关。这些模式在性能方面有所不同,因此在实现灯光时,必须考虑灯光模式。我们将研究使用三种不同的照明模式的优缺点:烘焙,混合和实时。

1.烘培

烘焙光模式提供静态照明:对象在运行期间不会更改其照明。烘焙灯是在运行游戏之前将照明数据存储在纹理贴图中的过程。

烘焙光模式的主要功能如下:

-无法在运行时修改灯光。灯光和阴影被烘焙到光照贴图中。在Unity中创建照明时完成此处理,并且不影响运行时性能。 

-阴影是静态的,在游戏过程中,阴影对于动态或运动的对象可能看起来很奇怪。

-烘焙光模式是我们在本指南中讨论的最便宜的计算方法。

2.混合

混合光模式可为静止的灯光提供移动的物体。这可以被视为其他两种方法的混合。

混合光模式的主要功能如下:

-动态直接照明和阴影

-可以将光包括在静态对象的光照贴图中计算。

-光线会影响动态对象,包括为这些对象生成阴影。

-可以在运行时更改强度,并且仅更新直射光。

-混合光模式是一种昂贵的计算方法。

3.实时照明

实时照明模式提供动态或可移动的照明,实时照明是最昂贵,最复杂的方式。

实时照明模式的主要功能如下:

-动态灯光和阴影,具有可以在运行时修改的属性,而不是烘焙为光照贴图。

-实时光照模式是我们在本指南中讨论的最昂贵的计算方法。

二、尽可能使用静态光

在移动设备上工作时,使用静态光至关重要。在设备上运行更便宜,并为游戏的最终用户带来更好的体验。

动态或实时光照在每帧中进行计算和更新,这是一种有效的方法,可用于移动对象,增强交互性并给场景增添情感。

相反,可以烘焙静态光信息。Unity在Unity Editor中执行烘焙光的计算,并将结果保存为照明数据。此过程称为烘焙。

计算完成后,运行时值仅是该场景所需的值。静态灯总是比动态灯便宜得多。这意味着,静态灯应该是你在资源有限的手机游戏中实现的首选。

三、尽可能的烘焙

尽可能多地烘焙应该是使用Unity在移动平台上进行照明的最初方法。光照贴图烘焙是计算光照效果(例如照明和阴影)并将此信息存储在称为光照贴图的单独纹理中的过程。光照贴图可用于增强对象的外观。通过执行此烘焙过程,你只需执行一次脱机计算。在运行时没有额外的性能成本。 

预烘焙的照明无法应对场景的动态或动态变化。但是,预烘焙照明的确包含所有静态元素的全局照明。这意味着每个静态元素都会获得从物体反射回来的间接光以及静态照明的直接光。下图显示了完全烘焙的场景的示例。

Unity使烘焙灯变得容易。你必须先设置两个主要步骤,然后才能烘焙灯光

1.单击Windows>渲染>光照设置,然后将要烘焙的光源设置混合烘焙。

对于移动平台,请尽可能使用烘焙,而不要混合使用。这是因为烘焙是所有选项中最便宜的。 

2.将接收到烘焙光的对象标记为“静态”:

对于标记为静态的对象,有多种可能的优化方法,但是通常我们在设置中选择了“ 所有 ”。将对象标记为“静态”后,Unity知道将其包含在轻度烘焙中。

注:  由于物体静态启用,你将无法移动或动画标记的对象。这是另一个优化,应尽可能保留。

烘培灯光时,请记住,数据是根据开始烘培时处于活动状态的场景保存的。生成的文件夹与刚烘培的场景具有相同的名称。在这里将存储照明数据的所有组件。如果你的项目使用一次加载的多个场景,则每个场景都需要烘焙其灯光。如果调整场景,则需要重新烘焙灯光。下图显示了该文件夹的创建位置。

四、优化光照贴图

配置要烘焙的灯光后,还应确保已优化烘焙的贴图

光照贴图的大小取决于烘焙时使用的设置。我们必须最小化移动平台上的内存使用,因此需要监控光照贴图的大小。在示例图像中,你可以看到有七个1024x1024像素的光照贴图。

在地图的预览中,你可以看到放置在其上的网格,并突出显示选定的网格。

Lightmapping中的某些设置以及实际贴图的大小决定了要使用多少空间。

以下各节介绍了最重要的设置。

1.光照贴图

Unity中的光照贴图器提供了三种不同的方法来烘培场景中的灯光:

  • 开导

  • 渐进式CPU

  • 渐进式GPU

下图显示了此选项。

在Unity中,对于任何新工作,都应使用渐进式选项之一。渐进式光照贴图器可节省大量时间,因为它们可以逐步创建光照图。如果选择了“  优先视图”  选项,则会优先显示场景视图中的区域。对视图进行优先级排序可以加快迭代时间,从而为场景设置照明。

CPU和GPU渐进式光照贴图器之间的主要区别在于,光照图生成是在CPU中还是在GPU中。这两个选项的结果相同,但是如果你具有功能强大的GPU,则该选项会快得多。有关GPU选项的更多要求和设置步骤,请参见  此处。 

2.纹理元素 

纹理像素或纹理元素是纹理贴图中的单个像素。像素用于例如在光照到光照图中的对象的每个点上存储光照信息。我们可以通过计算所使用的纹理像素的数量来衡量需要烘焙的工作量。

为了最大程度地影响所需的光照贴图数据量,你必须为烘焙的每个单位调整纹理像素的数量。这可以在“ Lightmapping设置”中完成。这些设置使你可以控制光照贴图,包括每个对象在烘焙中使用多少个纹理像素,如示​​例图像中所示。 

光照贴图设置包括一个称为光照贴图分辨率的选项  。此选项设置光照贴图中的每个单元使用多少个纹理像素。

在以下屏幕截图中,你可以看到具有不同的光照贴图分辨率  设置的多维数据集示例  。左侧图像的设置为1,中间图像的设置为2,右侧图像的设置为5。

你可以看到更高的分辨率如何快速增加所需的工作量。我们建议你从较低的“ 光照贴图分辨率”(介于5到10之间)开始  ,然后根据场景需要放大或缩小。增加光照贴图的分辨率会导致大小在每次迭代中都大大增加。

例如,在示例演示中,将光照图分辨率从15 降低到12,如下面的图像所示,将所需的光照图的数量从7减少到4。

3.纹理元素的用法 

在“ 光照贴图设置”中,可以设置场景每单位使用的纹理像素数量,但是有些对象不希望使用那么多的纹理像素。

Unity使你可以控制每个对象可以使用多少个纹理像素。对象的Inspector> Mesh Renderer包含一个称为Scale In Lightmap的参数  。你可以调整“ 光照贴图中缩放”以更改此对象在光照贴图中使用的纹理像素数量。

在下面的屏幕截图中,左侧是一个平均对象,因为每个光照单元的照明图分辨率设置为5 ,因此每个烘焙单元将获得5像素的照明信息。右侧是一个框,其中“ 在光照贴图中  缩放”  设置为0.5:

右侧框将比左侧框使用更少的空间。在下面的屏幕截图中,你可以看到光照贴图的设置。

尽量避免在以下元素上花费纹理像素: 

-玩家看不到的表面和物体。这样可以避免在较大的光照贴图上浪费内存,以节省屏幕上看不到的细节。

-表面上光变化很小的表面,例如阴影中的对象或仅被单个光触摸的对象。 

-小物体或薄物体。小物体或薄物体接收的照明量不会增加场景的最终渲染。 

五、尽量假

真实阴影的计算量很大。我们建议你实现假阴影,以在动态对象上显示阴影,而不求助于动态光照。

以下是一些实现伪影的方法:

  • 使用放置在角色下方并对其应用模糊纹理的3D网格,平面或四边形。

  • 使用Unity内置的渲染管线功能,可以使用放映机应用动态斑点阴影  。与在字符下使用四边形相比,此方法更昂贵,并且建议在移动设备中使用的通用渲染管线中不提供此方法。

  • 编写自定义着色器以创建更复杂的斑点阴影。

在示例演示Armies的后续屏幕截图中,使用阴影网格显示了阴影实现。

直接将照明信息绘制为纹理。通过将一些阴影着色为纹理,我们减少了多余灯光所需的额外计算。在场景中烘焙灯光时,直接绘制到纹理还可以节省内存,因为场景需要较少的纹理内存。

使用着色器或材质来模拟照明。你可以使用自定义材质来模拟灯光效果。例如,在游戏关卡中,我们可能希望角色具有边缘照明,以改善其可见性和视觉外观。可以使用着色器效果来创建灯光的幻觉,而不是使用灯光来创建此效果。

六、光探针

光线探测器有两个主要用途:光线探测器的主要用途是为场景中的运动对象提供高质量的照明(包括间接反射光)。光探测器的第二个用途是在静态风景使用Unity的细节等级(LoD)系统时提供静态风景的照明信息。

当使用带有烘焙照明的动态对象时,光照贴图通常不会受到光照贴图的影响。这可能会使它们看起来很奇怪,并且看起来好像它们不属于场景。

一个解决方案是光探针。光源探针与光照贴图的相似之处在于它们可以烘焙照明数据。但是,当光照贴图存储光如何照射场景中的表面时,光探测器将存储有关穿过场景中空白空间的光的数据。 

光线探测器仅存储和显示静态场景的灯光和阴影。这是因为光探头也已预烘焙。它们不是动态对象的阴影和灯光,实时灯光或自阴影的解决方案。但是光探头可以为你的场景提供大部分照明。

光探针有两个主要用途:

  • 照明场景中的移动物体。光线探测器会利用你的烘焙光,从而使对象具有与场景相同的照明。与使用实时照明灯相比,使用光探测器照明动态物体的成本更低。

  • 向使用LoD系统的静态标记对象提供照明数据。  

以下屏幕截图显示了使用的光探针的示例。

七、网格渲染器设置

无论场景使用什么照明,确保你的网格渲染器设置正确都是很重要的。

一个好的原则是关闭所有不使用的东西。诸如“ 投射阴影 ”之类的设置  可能会增加渲染场景的额外成本,即使对象没有照明也是如此。以下屏幕截图显示了场景的“ 网格渲染器”设置的示例:

设置这些选项的目的是在它们之间移动时,通过平滑混合来自最近的探测器的照明信息来获得照明,而不是反射。 由于我们使用的是Blob方法,因此“ 投射阴影”已关闭。“接收阴影”也已关闭,因为场景已烘焙,并且没有任何物体投射实时阴影。 

九、实时灯光和灯光类型

你应该尝试使用烘培的灯光,光照探针和材质效果处理所有的照明。有时候你需要使用实时光照,如果这样做,则必须考虑使用那种类型的实时灯光。

每种类型的实时光都有不同的计算成本:

  • 定向-方向一致,无脱落,定向光是实现其效果的最便宜的实时照明。通常,你只需要一个定向光,因为定向光可以照亮整个场景。这意味着使用正向渲染,Unity将始终渲染一个方向光。即使场景中没有定向光,也是如此。 

  • 点–点光源位于空间中的某个点,并且均匀地向所有方向发出光。

  • 聚光灯-由于聚光灯比球形聚光灯能剔除更多物体,因此聚光灯是第二便宜的实时照明类型。保持圆锥宽度狭窄,仅使其击中选定的对象,才能从这些灯光中获得最佳性能。 

虽然在各个方向上照明都是有帮助的,但它也相当昂贵。定向灯到处都有相对便宜的计算。聚光灯只能在小范围内使用,而点光源在较宽的区域内则很昂贵。同样,阴影计算可能是照明最昂贵的部分,因此向各个方向投射光会增加费用。

动态灯光的渲染成本很高,最好在手机游戏中避免使用。有时,对其使用有限制,具体取决于所使用的设备和图形API。例如,在具有OpenGL ES 2.0的Unity Universal Render Pipeline前向渲染器中,每个对象限制为四个光源。

(注:本文部分观点源于网络)

评论 0

0/1000
网易游学APP
为热爱赋能
扫描二维码下载APP