400-123-4657
点击量:807 时间:2023-02-19
灯光是游戏最重要的部分之一。这是因为灯光可以设定心情,引导游戏玩法并确定威胁和目标。灯光会影响游戏的视觉效果。例如,简单的模型在良好的照明技术下在游戏中看起来会更好,反之如果模型在不好的照明下会看起来更糟。Unity游戏引擎使照明工作变得简单明了。游戏平台以及硬件的性能影响着照明技术,欧宝电竞因此需要有效地使用灯光。
灯光有不同的模式。这些模式与灯光的移动性以及场景中的使用方式有关。这些模式在性能方面有所不同,因此在实现灯光时,必须考虑灯光模式。我们将研究使用三种不同的照明模式的优缺点:烘焙,混合和实时。
烘焙光模式提供静态照明:对象在运行期间不会更改其照明。烘焙灯是在运行游戏之前将照明数据存储在纹理贴图中的过程。
混合光模式可为静止的灯光提供移动的物体。这可以被视为其他两种方法的混合。
在移动设备上工作时,使用静态光至关重要。在设备上运行更便宜,并为游戏的最终用户带来更好的体验。
动态或实时光照在每帧中进行计算和更新,这是一种有效的方法,可用于移动对象,增强交互性并给场景增添情感。
相反,可以烘焙静态光信息。Unity在Unity Editor中执行烘焙光的计算,并将结果保存为照明数据。此过程称为烘焙。
计算完成后,运行时值仅是该场景所需的值。静态灯总是比动态灯便宜得多。这意味着,静态灯应该是你在资源有限的手机游戏中实现的首选。
尽可能多地烘焙应该是使用Unity在移动平台上进行照明的最初方法。光照贴图烘焙是计算光照效果(例如照明和阴影)并将此信息存储在称为光照贴图的单独纹理中的过程。光照贴图可用于增强对象的外观。通过执行此烘焙过程欧宝电竞,你只需执行一次脱机计算。在运行时没有额外的性能成本。
预烘焙的照明无法应对场景的动态或动态变化。但是,预烘焙照明的确包含所有静态元素的全局照明。这意味着每个静态元素都会获得从物体反射回来的间接光以及静态照明的直接光。下图显示了完全烘焙的场景的示例。
1.单击Windows渲染光照设置,然后将要烘焙的光源设置为混合或烘焙。
对于移动平台,请尽可能使用烘焙,而不要混合使用。这是因为烘焙是所有选项中最便宜的。
对于标记为静态的对象,有多种可能的优化方法,但是通常我们 在设置中选择了“所有”。将对象标记为“静态”后,Unity知道将其包含在轻度烘焙中。
注:由于物体静态启用,你将无法移动或动画标记的对象。这是另一个优化,应尽可能保留。
烘培灯光时,请记住,数据是根据开始烘培时处于活动状态的场景保存的。生成的文件夹与刚烘培的场景具有相同的名称。在这里将存储照明数据的所有组件。如果你的项目使用一次加载的多个场景,则每个场景都需要烘焙其灯光。如果调整场景,则需要重新烘焙灯光。下图显示了该文件夹的创建位置。
光照贴图的大小取决于烘焙时使用的设置。我们必须最小化移动平台上的内存使用,因此需要监控光照贴图的大小。在示例图像中,你可以看到有七个1024x1024像素的光照贴图。
Lightmapping中的某些设置以及实际贴图的大小决定了要使用多少空间。
在Unity中,对于任何新工作,都应使用渐进式选项之一。渐进式光照贴图器可节省大量时间,因为它们可以逐步创建光照图。如果选择了“优先视图”选项,则会优先显示场景视图中的区域。对视图进行优先级排序可以加快迭代时间,从而为场景设置照明。
CPU和GPU渐进式光照贴图器之间的主要区别在于,光照图生成是在CPU中还是在GPU中。这两个选项的结果相同,但是如果你具有功能强大的GPU,则该选项会快得多。有关GPU选项的更多要求和设置步骤,请参见此处。
纹理像素或纹理元素是纹理贴图中的单个像素。像素用于例如在光照到光照图中的对象的每个点上存储光照信息。我们可以通过计算所使用的纹理像素的数量来衡量需要烘焙的工作量。
为了最大程度地影响所需的光照贴图数据量,你必须为烘焙的每个单位调整纹理像素的数量。这可以在“Lightmapping设置”中完成。这些设置使你可以控制光照贴图,包括每个对象在烘焙中使用多少个纹理像素,如示例图像中所示。
光照贴图设置包括一个称为光照贴图分辨率的选项 。此选项设置光照贴图中的每个单元使用多少个纹理像素。
在以下屏幕截图中,欧宝电竞你可以看到具有不同的光照贴图分辨率设置的多维数据集示例 。左侧图像的设置为1,中间图像的设置为2,右侧图像的设置为5。
你可以看到更高的分辨率如何快速增加所需的工作量。我们建议你从较低的“光照贴图分辨率”(介于5到10之间)开始 ,然后根据场景需要放大或缩小。增加光照贴图的分辨率会导致大小在每次迭代中都大大增加。
例如,在示例演示中,将光照图分辨率从15 降低到12,如下面的图像所示,将所需的光照图的数量从7减少到4。
在“光照贴图设置”中,可以设置场景每单位使用的纹理像素数量,但是有些对象不希望使用那么多的纹理像素。
Unity使你可以控制每个对象可以使用多少个纹理像素。对象的Inspector Mesh Renderer包含一个称为Scale In Lightmap的参数 。你可以调整“在光照贴图中缩放”以更改此对象在光照贴图中使用的纹理像素数量欧宝电竞。
在下面的屏幕截图中,左侧是一个平均对象,欧宝电竞因为每个光照单元的照明图分辨率设置为5 ,因此每个烘焙单元将获得5像素的照明信息。右侧是一个框,其中“在光照贴图中缩放”设置为0.5:
右侧框将比左侧框使用更少的空间。在下面的屏幕截图中,你可以看到光照贴图的设置。
真实阴影的计算量很大。我们建议你实现假阴影,以在动态对象上显示阴影,而不求助于动态光照。
直接将照明信息绘制为纹理。通过将一些阴影着色为纹理,我们减少了多余灯光所需的额外计算。在场景中烘焙灯光时,直接绘制到纹理还可以节省内存,因为场景需要较少的纹理内存。
使用着色器或材质来模拟照明。你可以使用自定义材质来模拟灯光效果。例如,在游戏关卡中,我们可能希望角色具有边缘照明,以改善其可见性和视觉外观。可以使用着色器效果来创建灯光的幻觉,而不是使用灯光来创建此效果。
光线探测器有两个主要用途:光线探测器的主要用途是为场景中的运动对象提供高质量的照明(包括间接反射光)。光探测器的第二个用途是在静态风景使用Unity的细节等级(LoD)系统时提供静态风景的照明信息。
当使用带有烘焙照明的动态对象时,光照贴图通常不会受到光照贴图的影响。这可能会使它们看起来很奇怪,并且看起来好像它们不属于场景。
一个解决方案是光探针。光源探针与光照贴图的相似之处在于它们可以烘焙照明数据。但是,当光照贴图存储光如何照射场景中的表面时,光探测器将存储有关穿过场景中空白空间的光的数据。
光线探测器仅存储和显示静态场景的灯光和阴影。这是因为光探头也已预烘焙。它们不是动态对象的阴影和灯光,实时灯光或自阴影的解决方案。但是光探头可以为你的场景提供大部分照明。
一个好的原则是关闭所有不使用的东西。诸如“投射阴影”之类的设置 可能会增加渲染场景的额外成本,即使对象没有照明也是如此照明动态。以下屏幕截图显示了场景的“网格渲染器”设置的示例:
设置这些选项的目的是在它们之间移动时,通过平滑混合来自最近的探测器的照明信息来获得照明,而不是反射。 由于我们使用的是Blob方法,因此“投射阴影”已关闭。“接收阴影”也已关闭,因为场景已烘焙,并且没有任何物体投射实时阴影。
你应该尝试使用烘培的灯光,光照探针和材质效果处理所有的照明。有时候你需要使用实时光照,如果这样做,则必须考虑使用那种类型的实时灯光。
定向-方向一致,无脱落,定向光是实现其效果的最便宜的实时照明。通常,你只需要一个定向光,因为定向光可以照亮整个场景。这意味着使用正向渲染,Unity将始终渲染一个方向光。即使场景中没有定向光,也是如此。
聚光灯-由于聚光灯比球形聚光灯能剔除更多物体,因此聚光灯是第二便宜的实时照明类型。保持圆锥宽度狭窄,仅使其击中选定的对象,才能从这些灯光中获得最佳性能。
虽然在各个方向上照明都是有帮助的,但它也相当昂贵。定向灯到处都有相对便宜的计算。聚光灯只能在小范围内使用,而点光源在较宽的区域内则很昂贵。同样,阴影计算可能是照明最昂贵的部分,因此向各个方向投射光会增加费用。
动态灯光的渲染成本很高,最好在手机游戏中避免使用。有时,对其使用有限制,具体取决于所使用的设备和图形API。例如,在具有OpenGL ES 2.0的Unity Universal Render Pipeline前向渲染器中,每个对象限制为四个光源。