前言

关键词:

  • Reflections Captures 反射捕获
  • Planar Reflections 平面反射
  • Screen Space Reflections SSR 平面空间反射

看完本篇内容你将对以下概念心中有数:

  • UE4 有哪些反射技术,我们如何选择和组合
  • 反射系统下的性能优化

反射的实现思路

首先,对象能产生反射的前提是材质具有一定的光泽度。在UE4中,我们调整材质的 Metallic(金属感)、Specular(高光度)、Roughness(粗糙度)三个维度的参数来调整对象的光泽度,具体材质调整查看 此文档

真实世界里的反射是很难实现的,想象一下每个点产生的反射,整个世界都需要重新进行一次计算,即使只是两个反射对象和一束光,也会产生无数反射光,重复计算量非常之大,这对于现代硬件来说成本太大了,所以渲染引擎实际是通过一种 hack 的方式实现的,而不是像真实世界一样那么复杂。这意味着,很多时候渲染出的反射是不精准的,我们需要通过组合方案和调整参数达到适当的效果,也意味着可以脱离真实世界的“正确”去做艺术性的表达。

UE中所有的反射方式大致归为两类,第一类是实时计算,通过屏幕的深度和颜色缓存来计算;第二类是预计算,通过提前捕获计算出一个360°的图片,在实时渲染中再混合图像。
第一个就是我们常听说的 SSR 屏幕空间反射,第二种就是我们在 actor 中会看到的反射工具们,下面我们将展开讲讲。


SSR 屏幕空间反射

这是UE4 默认启用的反射,在后期处理体积(PostprocessVolume)内可以调节参数

屏幕空间反射正如它的名字一样,它是采集屏幕范围内可见对象进行计算,而不是整个世界的信息,这就导致它会出现一些视觉错误。

比如在我们现在这个场景内,我们能看到圆锥体上捕获的反射有地上的蓝字和人物,但当我们走进,篮字超出屏幕范围时,这部分反射就丢失了。

这就意味着 SSR 只能反射当前可见的内容。另外 SSR 的问题是反射产生的画面噪点也很多,尤其是反射区和空白区之间的过渡。

总的来说,SSR 是相对昂贵的,只要不在提前捕获反射的区域内,这部分就会采用 SSR 来实现反射。当然,SSR 也有优点,它不需要像反射捕获去调节位置避免混合出的图像偏离常识,它的计算是精准的,位置关系始终正确。

我们应该将 SSR 作为全局的兜底,保证始终有反射的保底质量,通过下文的各种反射捕获手段调节出效果更好、性能也更好的反射。


反射捕获

包括 球体反射捕获 Actor(Sphere Reflection Capture Actor)和 立方体反射捕获 Actor(Box Reflection Capture Actor)。

这两者本质上都是通过在摆放 actor 的位置捕获一张 360°的图像记录这个点的反射信息。区别是大多数场景使用球体都是合适的,但在一些方正的空间例如房子下,角落的投影会产生一些畸变,这时候换成立方体捕获出来的画面更合理。

这里需要关注几点,

  1. 捕获是由范围的。你可以通过一个个小的范围做出效果,也可以采用大的范围做出效果,也可以混合使用。
    • 在捕获效果的呈现上,包含关系的捕获点会被子节点接管,意思是如果有一个很大范围的捕获球,其中又包含了一个小捕获球,那么小捕获球范围内的反射是完全被小范围捕获球接管的;
    • 而如果有两个捕获球产生了交集,在交集的范围内,则会同时混合两个捕获结果。 —— 需要关注不要重叠太多太多,实时渲染的混合过程就会比较损耗了,最佳实践是不要超过8个,当到达20-40个的数量左右重叠计算压力很大。
  1. 捕获球的摆放位置会影响效果。因为最终是混合这个拜访点采集的反射画面信息,在混合的时候是可能出现不符合物理常识的位置错位的。
    • 需要反复检查呈现效果调节,大多数时候都是摆放在视口的高度,就是摄像机/玩家视角的高度上。

平面反射

平面反射并不常用,它对应着 平面反射 Actor (Planar Refloction Actor),适用于需要精准反射效果的平滑表面,但又不适用于特别大范围的情况。具体来说,它很适合镜子、局部的水面,但不适合大片的海面。

第一张是采用默认的 SSR 产生的反射效果,第二张是用平面反射处理的反射效果,第二张的细节很真实性明显要更好。

另外,平面反射与实时捕获不同,它是支持实时捕获的。


总结

  1. 调节全局 SSR 屏幕空间反射作为保下限,利用反射捕获等工具来增强反射效果。
  2. 对于移动应用、VR应用等性能吃紧的设备场景,合理减少反射分别率,甚至关闭复杂反射计算以提高性能。
    • 调整 UE4 反射分辨率在项目设置中,搜索 反射/Reflection可以看到
    • 反射分辨率多少合适, 64-128 都是相对高性能的,通常为了效果可以调到 1024,甚至 2048
  3. 减少过多的反射捕获重叠,最佳实践不超过 8个,超过 20-40 个会有明显的影响
  4. 即使把所有反射关闭,也会发现还有一些反射,这是因为 UE4 中 skylight 也具备反射捕获的能力,相当于为整个场景提供了低成本的备用反射捕获。