灯光优化
场景中的光源是资源消耗的(尤其是在有很多光源的情况下)。例如,根据光源类型,计算被照亮对象投射的阴影可能需要多达6次渲染通道。某些特定类型的光源设置也会影响性能。
这篇文章描述了基本的光优化技术。
常见的照明优化#
一些优化方法因光源的类型而异。但是,有几种常见的优化可以应用于场景中的所有光源。
禁用曲面的阴影#
您可以禁用某些表面或材质的阴影渲染。例如,它可以针对最远的 LOD 表面(当阴影无关紧要时)完成。
要禁用表面的阴影渲染:
- 在 World Hierarchy 窗口中,选择节点并转到 Parameters 窗口的 Node 选项卡中的 Surfaces 部分。
-
选择所需的曲面并关闭 Cast Proj and Omni Shadows 参数。要禁用世界光的阴影,请关闭 Cast World Shadows 参数。
要禁用材质的阴影渲染:
- 在 Materials Hierarchy 窗口中,选择材质并转到 Parameters 窗口的 Common 选项卡。
-
关闭 Cast Proj and Omni Shadow 参数。要禁用 World Light 的阴影,请关闭 Cast World Shadow 参数。
启用静态照明和阴影#
动态照明可确保正确渲染移动物体投射的移动光源的所有阴影。这种方法意味着场景的几何图形每帧再渲染一次,以计算每个 Projected 光源的阴影(或每 Omni 多六次)。在场景中使用多个动态灯光并动态计算它们的阴影可能会导致性能下降,尤其是当场景包含具有大量多边形的复杂几何体时。当大多数物体和灯光都是静态的时,这可能会严重浪费资源。
最好避免动态阴影,并尽可能对所有静态阴影使用烘焙阴影。您可以将动态 Omni 和 Projected 光源替换为静态光源(它们的阴影已预先计算并存储在深度纹理中)。
要渲染的阴影类型由灯光模式和阴影模式为两者设置灯和物体表面.
根据您的需要,您可以选择仅渲染烘焙阴影,或结合渲染烘焙阴影和动态阴影。下表显示了阴影设置的所有可能变体。
因此,对于动态光,来自所有被照亮对象的阴影都被渲染为动态的。
对于 Static 阴影模式的静态光,仅渲染来自具有 Mixed 阴影模式的对象的烘焙阴影;根本不渲染动态阴影。
对于 Mixed 阴影模式下的静态光,两种类型的阴影都会被渲染:烘焙(来自具有 Mixed 阴影模式的表面)和动态(来自具有 Dynamic 阴影模式的表面)。
混合模式意味着将动态阴影贴图复制到静态深度纹理并呈现结果。如果选择更高解决,复制阴影贴图的过程可能需要时间并影响性能。因此,如果场景有超过 150 万个三角形,Mixed 阴影模式下的 4K 分辨率是有意义的,否则 Dynamic 模式可能会更快。此外,请注意显存消耗,因为泛光灯的单个 4K 分辨率深度纹理大约需要 400 MB。
World Light 源以类似的方式工作,但它使用阴影级联.在 Dynamic 模式下,阴影级联是相对于相机的位置动态构建的,而在 Static 模式下,它们是烘焙的,并且它们的区域由光源的位置定义。 World Light 的 Static 模式适合作为小区域 ArchViz 项目的性能优化技术,其中阴影级联可分为两个部分:具有高分辨率阴影的可步行区域(因为它们被仔细观察)和不可步行区域低分辨率阴影(从远处观察)。请注意,在 Static 模式下无法更改时间,因为阴影级联已烘焙。
使用阴影蒙版#
Shadow 掩码允许您控制阴影的渲染。您可以指定由光源照亮的表面应该投射阴影:
-
对于光源,指定 Shadow 掩码:打开 World Hierarchy 窗口并选择您的光源。在 Parameters 窗口的 Node 选项卡的 Shadow Mask 部分中,指定阴影遮罩。
- 对于由光源照亮并应投射阴影的所有表面,指定与光源的 Shadow 遮罩匹配的 Shadow 遮罩(至少一位)。
- 对于应用于此类表面的所有材质,还要指定匹配的阴影遮罩。
使用屏幕空间阴影#
对于所有类型的光源,屏幕空间阴影可以代替远距离的阴影贴图进行渲染。它提高了性能,因为这样的阴影不依赖于几何的复杂性。
您可以通过以下方式之一启用屏幕空间阴影:
- 在菜单栏中,选择 Rendering -> Shadows -> Screen Space Shadows。
- 在菜单栏中,选择 Windows -> Settings,然后转到 Shadows 部分。在这里您可以打开 Screen Space Shadows 参数。
您还可以在 Parameters 窗口的特定类型选项卡(Light World, Light Omni 等)中设置每个灯光的屏幕空间阴影。
减小光源尺寸#
所有 Omni 和 Projected 光源都采用一种常见的延迟优化技术 - Scissor Test:为每个光源找到一个剪刀矩形来定义其边界,从而定义其影响区域。剪刀矩形定义当前光源的渲染目标的大小,因为在该区域之外的所有内容都不受当前时刻的光线影响。
启用 Scissors 可视化助手或使用 render_show_scissors 1 控制台命令启用 Scissor Test 的可视化。
因此,尺寸光源的大小对性能有显着影响:被照面渲染的屏幕面积越大,光性能越低。所以,尽量保持尺寸小。
使用交错灯光渲染#
设置可见距离#
您可以通过指定 visibility distances 来控制光源的渲染和投射阴影。
可以在 Settings 窗口的 Visibility Distances 部分中指定所有光源 (World, Omni, Projected) 的全局设置。
为透明对象设置限制#
不透明几何图形在渲染序列的 Forward 通道上着色。由于所有光源都在一个循环中应用于每个透明表面,因此强烈建议将影响透明对象的灯光数量保持在尽可能低的水平,以获得最佳性能。
全局灯光设置包括 Forward Per-Object Limits,您可以在其中限制一次影响每个透明对象的某些光源的数量。
在水上渲染灯光#
如果您的场景包含水对象,您可以禁用在它们上渲染来自光源的光。它将显着提高性能。
-
在 World Hierarchy 中选择一个光源。
-
在 Parameters 窗口中,转到 Render 部分并关闭 Water 参数。
世界之光#
这世界之光光源照亮沿阴影可见距离从而增加阴影的计算次数。所以建议尽量减少场景中 World Light 对象的数量。对于大多数目的,其他光源(Projected Light等)在项目性能方面更合适。
对于 World Light,引擎会创建级联阴影贴图(最多 4 级联)。每个级联都需要一个单独的渲染通道。
您可以通过减少 Parameters 窗口(Number of Cascades 参数)中渲染的级联数来影响性能。但是,改变级联的数量也会影响渲染的图像质量,所以要尽量找到一个平衡点。
全向灯#
Omni 光源向所有方向发射光,从而可以再现逼真的阴影投射。
Omni 光源使用6 个相机生成阴影贴图,因此该光源的阴影需要6 次渲染通道,并且会大大降低性能。因此,尽量减少此类光源的数量。为了获得更好的性能,您可以禁用 Omni 光在某些方向上创建的阴影的渲染或使用 Projected 光源而不是 Omni 光源。
但是,有一种方法可以在场景中使用大量 Omni 光源而不会对性能产生负面影响:您应该为它们禁用阴影(不是屏幕空间阴影)。由于引擎在禁用 Point 形状和阴影的情况下对 Omni 灯使用平铺渲染,它们将被分组并分批渲染,从而减少 DIP 调用的数量并使 Omni 灯成为场景中最快的光源。
相关设置可在配料选项:
这种优化使您能够使用大量 Omni 灯,而不会显着降低性能。
您还可以通过指定来控制 Omni 灯光的渲染和投射阴影能见度对于光源。当相机位于距光源给定距离处时,它会关闭。可以为投射阴影指定相同的内容:
- 打开 World Hierarchy 窗口并选择一个 Omni 光源。
- 在 Parameters 窗口中,指定 Distance Visibility Settings。
投射光#
Projected 光源从一个点投射光线,形成一个光金字塔。这种光源产生的阴影只需要1 个渲染通道,因此它们的性能很低。
但是,这些光源对性能的影响也可以通过指定来减少能见度对于光源和投射阴影:
- 打开 World Hierarchy 窗口并选择一个 Projected 光源。
- 在 Parameters 窗口中,指定 Distance Visibility Settings。
体素和环境探测器#
Voxel Probe 光源通过使用预烘焙的 3D 光照贴图在 Probe 内部的对象上提供静态体素光照和着色。 Voxel Probe 是必需的对象在静态模式下烘焙来自光源的间接照明.
在另一个 Voxel Probe 中使用 Voxel Probe 作为插图会显着降低性能。此外,如果您添加多个大小一致的嵌套 Voxel Probe 对象,则视觉结果将与添加单个 Voxel Probe 相同。但是,性能会下降。所以,如果可能的话,尽量避免这种情况。
显着降低性能的 Voxel Probe 的主要设置是 Cubic Filtering。如果环境照明的线性过滤足够,则禁用它。
影响性能的另一种设置是 Reflections。打开时,Voxel Probe 用于两者环境照明和反思.我们建议您使用 Environment Probe 进行反射模拟。
Environment Probe 光源提供环境照明和反思使用立方体贴图在 Probe 内的对象上。但是,Environment Probe 的主要用途是反射渲染。对于照明,我们建议使用 Voxel Probe:只需在 Parameters 窗口中关闭 Indirect Diffuse 照明即可。
这种方法可以在不损失视觉质量的情况下提高应用程序性能:同时使用 Environment 和 Voxel Probes 进行环境照明和反射很少能带来显着的视觉改善。
假照明#
当您只需要在没有照明的情况下可视化光源时,您可以使用下面描述的技巧之一。
使用广告牌#
Billboards 可用于模拟从远距离观察到的小光源。在这种情况下,只有光源的可视化很重要。例如,您可以将 Billboards 用于起飞跑道灯。它们不产生任何光,但看起来像真正的光。
要创建替换真实光源的 Billboard,请执行以下操作:
-
通过在菜单栏中选择 Create -> Billboards -> Base 将 Billboard 对象添加到场景中,并将其放置在世界的某个位置。
- 分配从 billboards_base 材质继承的材质。
-
为此材质指定以下设置:
-
在 Common 选项卡中,将混合 Preset 设置为 Additive 并关闭 Depth Write 参数以避免遮挡 Billboard 后面的对象。
-
在 States 选项卡中,禁用写入 Deferred Buffers 并启用以下状态:
- Emission 通过使用相应的纹理来提供发射效果。
- Geometry Inflation 将最小 Billboard 屏幕尺寸限制为固定值,因此,提供远距离可见性。
- Soft Interaction 使 Billboard 与场景中其他对象的交互更柔和并避免伪影。
-
在 Textures 选项卡中,指定 Diffuse 和 Emission 纹理。
-
在 Parameters 窗口中,指定以下值:
- 将 Diffuse 颜色乘数设置为black ,使 Billboard 变得完全透明。
- 增加 Emission Scale 使 Billboard 更亮。
- 增加几何参数缩放 Billboard 的大小并限制 Billboard 的最小大小。
- 如有必要,更正 Soft Interaction 值。
-
结果,您获得了可用于模拟远距离小光源的 Billboard。您可以将任何所需数量的 Billboards 添加到现有的 Billboard 对象中:在 Parameters 窗口中,选择列表中创建的 Billboard 并单击 Add。
使用体积对象#
Volumetric 对象可用于模拟可见光体积,而不是使用真实光源。当您不需要照明时,应使用此类对象。例如,通过使用 Volumetric 对象,您可以创建灯光球体,梁, 要么卷, 模仿太阳光束通过开口落入房间,等等。
要创建此类轻量级,请执行以下操作:
-
通过在菜单栏中选择 Create -> Volume -> Sphere Light 添加 Volume Sphere 对象,并使其成为应该发光的节点的子节点。
- 在 Parameters 窗口的 Volume Sphere 部分,将球体的大小更改为 0.15。
-
在 Parameters 窗口的 Node 选项卡中,将体积球体的坐标设置为父节点,然后稍微修正球体位置,使其看起来更逼真。
-
分配从 volume_light_base 基础材质继承的材质,并在 Parameters 选项卡中指定所需的值。例如,您可以设置颜色光球和缩放密度的光。
-
通过在菜单栏中选择 Create -> Volume -> Projected 添加 Volume Projected 对象,并使其成为应该发光的节点的子节点。
-
在 Parameters 窗口的 Node 选项卡中,将 Volume Projected 的位置和旋转重置为父节点的位置和旋转。
-
在 Parameters 窗口的 Volume Projected 部分,指定光束所需的参数。例如,改变它的尺寸、半径、视野和步长.
- 分配从 volume_proj_base 基础材质继承的材质。
-
在材质的 Parameters 窗口中,设置颜色光束与 Volume Sphere 相同,并减少弥散尺度到 0.5 以使颜色不那么明亮。
结果,您会得到一个光球和一个模仿真实光源的光束。