平面反射

平面反射(Planar Reflections)

UE4 支持实时平面反射,它比屏幕空间反射(SSR)更加精确,但渲染开销较高。渲染开销较高的原因来自平面反射的工作原理。因为平面反射实际上将从反射方向再次对关卡进行渲染。

Planar_Reflections_00.png

屏幕空间反射 VS 平面反射

在渲染方面,屏幕空间反射(SSR)比平面反射更为高效,但可靠性较差。下图将 SSR 的缺陷和平面反射进行了对比。

Screen Space Reflections

Screen Space Reflections

Planar Reflections

Planar Reflections
  • 屏幕空间反射:左图展示了屏幕空间反射的局限性。注意图像边缘出现了大量“泄露”。出现此现象的原因是 SSR 无法反射画面外的物体。

  • 平面反射:右图为相同的关卡,启用的是平面反射。注意图像中,甚至两侧均未出现“泄露”。原因是平面反射能够反射画面外的物体。

启用平面反射

执行下列操作即可在项目中启用并使用平面反射:

  1. 在主工具栏中前往 Edit > Project Settings,然后前往 Project Settings 菜单下的 Rendering > Optimizations 部分。

  2. 点击 Support global clip plane for Planar Reflections 旁边的勾选框,在弹出提示后重启 UE4 编辑器。

    PR_Enable_PR_00.png

    启用平面反射后如未重启 UE4 编辑器,可能导致平面反射无法使用。

  3. 重启 UE4 编辑器后,前往 Modes 面板,从 Visual Effects 部分选择一个 平面反射 Actor 并将其拖入关卡。

  4. 将平面反射 Actor 放进关卡后,即可使用 G 键隐藏或取消隐藏 Actor。可使用 移动旋转缩放 工具更佳地放置平面反射 Actor 并设置大小,满足关卡需求。

    平面反射 Actor 被添加到关卡后,附近的反射材质将自动受到影响。放置在关卡中的静态网格体的法线用于反射的失真,模拟波纹效果。

平面反射 Actor 属性分解

平面反射 Actor 拥有多个属性,调整后可对反射效果产生较大影响。下表包含这些属性,以及它们对平面发射效果产生的改变。

设置名称

描述

Normal Distortion Strength

控制平面反射失真时的法线强度。

Prefilter Roughness

初滤平面反射纹理使用的粗糙系数,用于隐藏低分辨率。数值越大,GPU 开销越高。

Distance from Plane Fade Start

从反射平面到该距离的接收像素将开始淡出平面反射。

Distance from Plane Fade End

从反射平面到该距离的接收像素将完全淡出平面反射。

Angle from Plane Fade Start

反射平面和法线形成该角度的接收像素将开始淡出平面反射。

Angle from Plane Fade End

反射平面和法线形成该角度的接收像素将完全淡出平面反射。

Prefilter Roughness Distance

达到初滤粗糙系数的距离。

Screen Percentage

降低采样百分比可用于减少平面反射渲染的 GPU 时间。

Extra FOV

渲染到反射纹理时所使用的附加视野。法线失真在反射纹理外产生读数据时此项十分实用。数值越大,渲染线程和 GPU 开销越大。因为更多物体和三角形需要被渲染到平面反射中。

平面反射局限性

虽然平面反射拥有真实的反射效果,但此功能也存在以下局限性。

  • 无法控制反射通道中启用的渲染功能。

  • 反射通道中的动态阴影不正确。

  • 为保证达到目标帧率,需计算资源是否足以使用平面反射。

  • 只支持恒定的粗糙系数,其在平面反射组件上(而非在材质上)进行指定。

  • 如可能,须尽量将世界场景中的平面反射 Actor 数量限制为 1 个,将其移动、旋转、缩放,和世界场景搭配。也可使用多个平面反射 Actor,但需多加注意,因为平面反射 Actor 不执行任何距离剔除,只进行视锥和遮蔽剔除。因此,如果画面中同时存在两个平面反射 Actor,项目的帧率将受到严重影响。

  • 渲染平面反射 Actor 的开销直接来自当前关卡中渲染的内容。启用此功能后,由三角形组成、绘制调用较大的场景将遭受严重的性能影响,因为这些开销不会随屏幕百分比变化。

平面反射性能

在项目中启用平面反射可实现相当精确的反射,但该功能会对项目性能产生直接影响。以下部分将说明在针对高端 PC 的项目和针对移动设备的项目中启用平面反射后的性能影响。

此处使用 UE4 launcher 中“风筝和无尽之剑草地”项目 4.12 版本展示平面反射的性能影响。

平面反射性能和风筝 Demo

由于风筝 Demo 地形地貌的大小和多变的高度,添加并缩放单个平面反射 Actor 包含整个关卡无法执行,可能导致性能极差。需要策略性地对平面反射 Actor 进行放置和缩放,使其适应关卡中需要反射的区域。下图中可以看到在风筝 Demo 中平面反射在水面上形成的视觉效果。

Planar Reflections Off

Planar Reflections Off

Planar Reflections On

Planar Reflections On

平面反射对关卡的视觉效果提升十分大,但对性能的影响也极大。在下方左图 平面反射关闭 中可以看到,整个关卡的渲染时间为 31 ms。在下方右图 平面反射开启 中可以看到,整个关卡的渲染时间为 29.19 ms。此外,平面反射的渲染时间为 23.07 ms。因此带平面反射场景的整体渲染时间为 52 ms 左右。

平面反射消耗 31 ms 进行渲染的原因是风筝 Demo 中使用了全动态光影。使用静态/预计算光影的关卡再次进行平面反射渲染时效率更高。

平面反射性能和无尽之剑地牢

基于无尽之剑精灵遗迹地图的规模和布局,只需要一个平面反射,将其缩放匹配关卡中放置的水面静态网格体即可。在下图中可看到精灵遗迹地图水面添加平面反射后的效果。

Planar Reflections Off

Planar Reflections Off

Planar Reflections On

Planar Reflections On

添加平面反射后,水面效果更加逼真;较之于风筝 Demo,性能影响也较小。在下方左图“平面反射关闭”中可看到,不带平面反射场景的渲染时间约为 11 ms。在下方右图“平面反射开启”中可看到,平面反射的渲染时间约为 1.67 ms,关卡整体渲染时间约为 13 ms。

精灵遗迹地图中的平面反射渲染时间为 1.67 ms,而风筝 Demo 中的渲染时间为 23.07 ms。造成此差异的原因是静态网格体和材质的构建方式。精灵遗迹地图及其内容针对移动设备设计,每个资源使用的三角形和材质指令数量均有严格限制。因此在该地图中启用平面反射时开销较低,因为这里使用的资源复杂度和规模均低于风筝 Demo。