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

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


-
屏幕空间反射: 左图展示了屏幕空间反射的局限性。注意图像边缘出现了大量"泄露",或者说面向摄像机视角的池塘部分上的反射开始淡出。出现此现象的原因是SSR无法反射画面外的物体。
-
平面反射: 右图为相同的关卡,启用的是平面反射。注意图像中,甚至池塘的两侧和边缘均未出现"泄露",反射保持了连贯和精准。原因是平面反射能够无视摄像机视角,反射画面外的物体。
启用平面反射
执行下列操作即可在项目中启用并使用平面反射:
-
点击 主(Main) 菜单面板上的 编辑(Edit) ,选择 项目设置(Project Settings) 。
-
在 项目设置(Project Settings) 菜单中,找到 渲染(Rendering)> 反射(Reflections) 分段。
反射"分段" loading="lazy" src="https://d1iv7db44yhgxn.cloudfront.net/documentation/images/e1064f58-5200-4e2a-9219-e60a915c6b2e/04-plan-refl-rendering-reflection-section.png" width="700"> 点击查看大图。
-
点击 支持平面反射的全局裁剪平面(Support global clip plane for Planar Reflections) 旁边的复选框。
点击查看大图。
在启用平面反射后,如果未能重启UE编辑器,则平面反射无法正常运行。
-
在系统提示时重启UE编辑器。
-
重启UE编辑器后,转至 放置Actor(Place Actors) 面板,在 视觉效果(Visual Effects) 选项卡中,选择 平面反射Actor(Planar Reflection Actor) 并将其拖入关卡中。
点击查看大图。
-
将平面反射Actor放进关卡后,即可使用 G 键隐藏或取消隐藏 Actor。可使用 移动 、 旋转 和 缩放 工具更佳地放置平面反射Actor并设置大小,满足关卡需求。
平面反射Actor被添加到关卡后,附近的反射材质将自动受到影响。放置在关卡中的静态网格体的法线用于反射的失真,模拟波纹效果。
平面反射Actor的属性
平面反射Actor有多个属性,当调整这些属性时,会大大影响反射的显示效果。下表概述了这些属性以及它们将如何改变平面反射的显示效果。

属性 | 说明 |
---|---|
法线扭曲强度(Normal Distortion Strength) | 扭曲平面反射时控制法线强度。 |
预过滤粗糙度(Prefilter Roughness) | 预过滤平面反射纹理所使用的粗糙度值。此属性适用于隐藏低分辨率。值越大,GPU开销越高。 |
平面淡化开始距离(Distance from Plane Fadeout Start) | 从反射平面接收处于此距离的像素时将开始淡化平面发射。 |
平面淡化结束距离(Distance from Plane Fadeout End) | 从反射平面接收处于此距离的像素时将完全淡化平面发射。 |
平面淡化开始角度(Angle from Plane Fade Start) | 从反射平面接收法线处于此角度的像素时将开始淡化平面发射。 |
平面淡化结束角度(Angle from Plane Fade End) | 从反射平面接收法线处于此角度的像素时将完全淡化平面发射。 |
显示预览平面(Show Preview Plane) | 在编辑器中工作时切换反射平面的可见性。此属性不会影响平面反射。 |
高级属性 | |
预过滤粗糙度距离(Prefilter Roughness Distance) | 将达到预过滤粗糙度值的距离。 |
屏幕百分比(Screen Percentage) | 下采样百分比,可用于减少GPU渲染平面反射的时间。此属性直接影响平面反射所产生的反射的质量。 |
额外视野(Extra FOV) | 渲染至反射纹理时使用的额外视野(FOV)。法线扭曲引起反射纹理外读取时,此属性十分实用。较大的值将增加渲染线程和GPU开销,因为更多对象和三角形将被渲染到平面反射中。 |
渲染两面场景(Render Scene Two-Sided) | 是否将场景渲染为两面,适用于隐藏法线扭曲会在被反射平面裁切的对象"下方"读取的瑕疵。启用此设置后,网格体的背面将显示在裁切区域中,而非可能为明亮天空的背景中。如启用此属性,则必须将水平面添加到 隐藏Actor(Hidden Actors) ,因为水平面现在不会阻挡反射。 |
LOD距离因子(LOD Distance Factor) | 缩放细节层级(LOD)使用的距离。设为大于1的值会导致场景捕获使用低于主视图的LOD,以加速场景捕获传递。 |
平面反射Actor的场景捕获属性
平面反射Actor还有多个属性,使用这些属性,您可以控制捕获的实时反射性能开销。

属性 | 说明 |
---|---|
图元渲染模式(Primitive Render Mode) | 控制被渲染到场景捕获中的图元。
|
捕获源(Capture Source) | 控制捕获源类型。
|
捕获每一帧(Capture Every Frame) | 是否每帧更新捕获的内容。如禁用,组件只在加载时渲染一次,然后只在移动时再次渲染。 |
运动中捕获(Capture on Movement) | 是否更新运动中的捕获内容。如果您要从蓝图手动捕获,则将其禁用。 |
始终保留渲染状态(Always Persist Rendering State) | 是否保留渲染状态,即便禁用 捕获每一帧(Capture Every Frame) 也是如此。这可计算动态模糊和临时抗锯齿(TAA)的速度。 |
隐藏Actor(Hidden Actors) | 关卡中可用且要在场景捕获中隐藏的所选Actor的列表。 |
仅显示Actor(Show Only Actors) | 将 图元渲染模式(Primitive Render Mode) 用于 使用ShowOnly列表(Use ShowOnly List) 时,关卡中将由此场景捕获渲染的可用Actor的列表。 |
最大视图距离覆盖(Max View Distance Override) | 设置当值大于0时,场景捕获中渲染的图元的最大渲染距离(单位:厘米)。如发射平面处于一个封闭区域(如走廊或房间)中,则可使用此选项来剔除反射的远景物体。 |
捕获排序优先级(Capture Sort Priority) | 设置帧中的捕获优先级,对GPU上的场景捕获进行排序,解决多个捕获组件之间的相互依赖性。优先级最高则最先进行。 |
启用时使用光线追踪(Use Ray Tracing if Enabled) | 是否将光线追踪用于此捕获。光线追踪必须在项目中启用。 |
分析事件名称(Profiling Event Name) | 设置分析GPU时分析事件的名称。当在关卡中使用了多个平面反射时,了解正在使用哪个平面反射很有用。 |
高级属性 | |
通用显示标志(General Show Flags) | 通用功能显示标志,用于将一些功能和Actor从正在渲染切换到场景捕获。例如,抗锯齿、雾、静态网格体、骨架网格体等。 |
高级显示标志(Advanced Show Flags) | 通用高级功能显示标志,用于将一些功能和Actor从正在渲染切换到场景捕获。例如,植物、实例化静态网格体、Paper 2D Sprties等。 |
后期处理显示标志(Post Processing Show Flags) | 切换显示标志,用于将泛光、眼部适应和动态模糊从正在渲染切换到场景捕获。 |
光源类型显示标志(Light Types Show Flags) | 切换显示标志,用于将天空光照从正在渲染切换到场景捕获。 |
光照组件显示标志(Lighting Components Show Flags) | 切换显示标志,用于将环境遮挡和动态阴影从正在渲染切换到场景捕获。 |
光照功能显示标志(Lighting Features Show Flags) | 切换通用显示标志,用于将光照功能从正在渲染切换都场景捕获。例如,距离场环境遮挡(DFAO)、光照函数、屏幕空间反射。 |
隐藏显示标志(Hidden Show Flags) | 切换显示标志,用于将光照和后期处理从正在渲染切换为场景捕获。 |
平面反射的限制
虽然平面反射提供了一些非常逼真的反射,但此功能确实存在下面列出的一些限制。
- 平面反射会导致整个场景被渲染两次,所以要把一半的帧时间花在渲染线程和GPU上!
- 限制世界场景中放置的平面反射数量。很多时候,一个还是太多。
- 适当地调整它的大小,使其能够在不可见的情况下被剔除。
- 渲染平面反射角色的开销直接来自当前在关卡中进行渲染的内容。当启用此功能时,因为这些开销不随着屏幕百分比(Screen Percentage)缩放,所以存在大量三角形和绘制调用的场景将遭受最多的性能问题。
平面反射性能
在项目中启用平面反射可实现相当精确的反射,但该功能会对项目性能产生直接影响。以下部分将说明在针对高端 PC 的项目和针对移动设备的项目中启用平面反射后的性能影响。
下面的示例使用 风筝与无尽之剑:草地(Kite & Infinity Blade Grass Lands) 项目来演示平面反射的性能影响。你可以在 Epic Games启动程序(Epic Games Launcher) 的 商城(Marketplace) 中找到此项目。
平面反射性能和风筝Demo
由于风筝Demo地形地貌的大小和多变的高度,添加并缩放单个平面反射Actor包含整个关卡无法执行,可能导致性能极差。需要策略性地对平面反射Actor进行放置和缩放,使其适应关卡中需要反射的区域。下图中可以看到在风筝Demo中平面反射在水面上形成的视觉效果。


平面反射对关卡的视觉效果提升十分大,但对性能的影响也极大。在下方左图 平面反射关闭 中可以看到,整个关卡的渲染时间为31 ms。在下方右图 平面反射开启 中可以看到,整个关卡的渲染时间为29.19 ms。此外,平面反射的渲染时间为23.07 ms。因此带平面反射场景的整体渲染时间为52 ms左右。
![]() |
![]() |
---|---|
平面反射关闭 | 平面反射开启 |
点击查看全图 | 点击查看全图 |
平面反射消耗31 ms进行渲染的原因是风筝Demo中使用了全动态光影。使用静态/预计算光影的关卡再次进行平面反射渲染时效率更高。
平面反射性能和无尽之剑地牢
基于无尽之剑精灵遗迹地图的规模和布局,只需要一个平面反射,将其缩放匹配关卡中放置的水面静态网格体即可。在下图中可看到精灵遗迹地图水面添加平面反射后的效果。


添加平面反射后,水面效果更加逼真;较之于风筝Demo,性能影响也较小。在下方左图"平面反射关闭"中可看到,不带平面反射场景的渲染时间约为11 ms。在下方右图"平面反射开启"中可看到,平面反射的渲染时间约为1.67 ms,关卡整体渲染时间约为13 ms。
![]() |
![]() |
---|---|
平面反射关闭 | 平面反射开启 |
点击查看全图 | 点击查看全图 |
精灵遗迹地图中的平面反射渲染时间为1.67 ms,而风筝Demo中的渲染时间为23.07 ms。造成此差异的原因是静态网格体和材质的构建方式。精灵遗迹地图及其内容针对移动设备设计,每个资源使用的三角形和材质指令数量均有严格限制。因此在该地图中启用平面反射时开销较低,因为这里使用的资源复杂度和规模均低于风筝Demo。