Language:
Page Info
Engine Version:
Share

反射环境

反射环境 功能在关卡的每个区域提供有效光泽反射。金属之类的诸多重要材质均依赖于反射环境提供的各方向反射。其针对的目标是主机和中配PC,因此运行速度极快。支持动态对象或尖锐反射,但需要额外的内存开销。

Reflection Environment

快速反射环境设置

执行以下操作即可快速使在项目关卡中快速搭建反射环境:

  1. 将数个光源添加到关卡并构建光照,因为显示反射环境需要一些间接漫反射光照。

  2. 视觉效果(Visual Effects) 部分下的 模式 面板中选择并将一个 球体反射采集 Actor拖入关卡。

如果关卡中未出现反射,或反射强度未达到期望效果,可尝试以下操作:

  • 使材质拥有明显的高光度和较低的粗糙度,这样便于显示反射。

  • 使用反射覆盖视图模式显示正在被采集的内容,以便更好地确认材质中的哪些值需要进行调整。

设置关卡使用反射环境

构建良好反射的第一步是使用光照图来设置包含间接光照的漫反射光照。如不熟悉用法,可参见Lightmass 中的详情。如果构建光照后Lightmass间接光照无法正常工作,其中常见原因包括但不限于以下几种:

  • 阴影投射天空盒。

  • LightmassImportanceVolume 缺失。

  • 光照图UV缺失或未正确设置。

  • 场景属性 中将 强制无预计算光照 设为了 True

场景的漫反射颜色将通过反射环境来进行反射,因此需要执行以下操作来达到最佳效果。

  • 确保直接光照和阴影区域之间拥有较高的对比度。

  • 请注意:明亮的漫反射光照区域将清晰地显示在反射中。

  • 反射可见度最高的区域是暗阴影区域。

  • 禁用高光度显示标签,再使用光照视图模式查看关卡即可了解反射采集的效果。

同时需要将以下重要事项牢记于胸,以便设置关卡材质完美兼容反射环境。

  • 扁平的镜像表面将揭示出将投射到简单形状上的立方体贴图组合起来的不准确性。

  • 曲面几何体或粗糙表面均可弱化这些瑕疵,提供更准确的结果。

  • 使用详细法线贴图非常重要,并在用于平坦区域的材质上增加一些粗糙度, 这有助于其更好地显示反射。

Curvy and Sharp

Flat and Rough

Flat and Sharp

表面平滑的曲面几何体:高质量反射

表面粗糙的平面几何体:高质量反射

表面平滑的平面几何体:反射明显不匹配

将反射采集放置在需要拥有反射的区域中。尝试对球体采集进行放置,使得需要反射的关卡部分刚好包含在其半径之中,因为关卡将被重新投射到该球形之上。避免让采集过于靠近关卡几何体,附近的几何体将因此占据主导,阻挡其后的重要细节。

光泽间接高光度

用技术术语来讲,反射环境将提供间接高光度。可以从解析光源获得直接高光度,但这只会提供几个明亮的方向上的反射。也可以通过天空光照获取来自天空的光照度;但这并不会提供本地反射,因为天空光照立方体贴图所处位置必定很远。间接高光度使关卡的所有部分在所有其他部分上进行反射,对没有漫反射反应的材质(如金属)而言尤其重要。

Diffuse Only

Reflection Only

完整光照

Full Scene

反射环境的工作原理是采集多个点处的静态关卡,并将其重新投射到反射中的简单形状上(如球形)。美术师放置 ReflectionCapture Actor即可选择采集点。反射在编辑中实时更新,以协助放置,但在运行时为静态。将采集的关卡投射到简单形状上可构成反射的近似视差。每个像素在多个立方体贴图之间混合,以获得最终结果。较小的ReflectionCapture Actor将覆盖较大的Actor,因此可根据需要提升区域中的反射视差准确度。举例而言,可将一个采集放置在房间中央,然后在房间角落放置较小的采集来提升反射效果。

从采集立方体贴图生成模糊mipmap即可支持带不同光泽度的材质。

Varying Glossiness

然而,只在非常粗糙的表面上使用立方体贴图反射会造成过于明亮的反射,由于缺少本地遮挡,其将出现重大泄露。重新使用由Lightmass生成的光照贴图数据即可解决此问题。立方体贴图反射基于材质的粗糙度与光照贴图间接高光度进行混合。非常粗糙的材质(全漫反射)将在光照贴图结果上收敛。从根本上而言,此混合是将一套光照数据(立方体贴图)的高细节部分与另一套光照数据(光照贴图)的低频率部分进行组合。为使此混合正常进行,光照贴图中只能拥有间接光照。这意味着只有来自静止光源的间接光照才能改良粗糙表面上的反射质量。静态光源类型不应与反射环境同用,因其会将直接光照放入光照贴图中。 注意,和光照贴图的这个混合也意味着贴图必须含有有意义的间接漫反射光照,且该光照已构建,才能显示出结果。

Reflections on a rough surface with no shadowing

Rough with Shadowing

反射采集光照贴图混合

使用反射采集Actor时,UE4将把来自反射采集的间接高光度与来自光照贴图的间接漫反射光照进行混合。这有助于减轻泄露,因为反射立方体贴图只在空间中的一个点处进行采集,但光照贴图却是在所有接收者表面上计算,且包含本地阴影投射信息。

Reduce Lightmap Mixing On Smooth Surfaces Off

Reduce Lightmap Mixing On Smooth Surfaces On.png

虽然光照贴图混合在粗糙表面上效果极佳,但此方法在平滑表面上却无用武之地,因为来自反射采集Actor的反射与其他方法(如屏幕空间反射或平面反射)形成的反射并不匹配。因此,光照贴图混合不再应用到非常平滑的表面上。粗糙度值为0.3的表面将获得完整的光照贴图混合,粗糙度0.1或以下则淡化至无光照贴图混合。这也使得反射采集和屏幕空间反射更好地匹配,两者之间的过渡也更加自然。

光照贴图混合与现有内容

光照贴图混合将被默认启用,意味着其将影响现有内容。在平滑表面上出现反射泄露时,泄露将更加明显。为解决此问题,可在关卡周围放置更多反射采集Actor来减轻泄露;或切换为旧有光照贴图混合行为,方法为:前往 编辑 > 项目设置 > 渲染 > 反射,然后取消勾选 减弱平滑表面上的光照贴图混合

Enable_LM_Mixing.png

通过UE4控制台调整以下命令即可微调将发生的光照贴图混合量。

  • r.ReflectionEnvironmentBeginMixingRoughness (default = 0.1)

  • r.ReflectionEnvironmentEndMixingRoughness (default = 0.3)

  • r.ReflectionEnvironmentLightmapMixBasedOnRoughness (default = 1)

  • r.ReflectionEnvironmentLightmapMixLargestWeight (default = 1000)

高质量反射

使用默认的反射质量设置可以在性能和视觉质量上达到良好平衡,但有些情况下也需要达到更高质量的反射。以下部分描述了达到高质量反射的可用方法。

高精确度静态网格体顶点法线和切线编码

达成高质量反射的重要因素是顶点法线和切线的呈现精确度。极高密度的网格体可能导致相邻顶点量化到相同的顶点法线和切线值。这可能会在法线朝向上形成块状跳跃。我们添加了将法线和切线编码为每通道矢量16位的选项,使开发者能够在更高质量和编码顶点缓冲内存使用率之间进行权衡。

启用高精确度静态网格体顶点法线和切线编码的方法:

  1. 内容浏览器 中双击静态网格体将其在 静态网格体编辑器 中打开。

  2. 在静态网格体编辑器中前往 细节 面板并展开 LOD0 选项。

  3. LOD0 下方有一个名为 构建设置(Build Settings) 的部分。点击“构建设置(Build Settings)”旁的小三角形即可展开选项。

  4. 点击 使用高精确度切线基础 选项旁边的勾选框将其启用,然后按下 应用修改(Apply Changes) 按钮来应用新设置。

视口将自动更新来显示修改。

被查看的反射的质量与静态网格体的曲面细分密度直接相关。拥有更少曲面细分的静态网格体在反射中出现的拉伸瑕疵多于拥有更多曲面细分的静态网格体。

High Precision Vertex Normal Off

High Precision Vertex Normal On

高精确度GBuffer法线编码

启用“高精确度GBuffer法线编码”选项将允许GBuffer使用更高精确度的法线编码。这个高准确度GBuffer法线编码将把法线矢量编为3个通道,每个通道为16位。使用此高精确度编码后,屏幕空间反射(SSR)等技术将依赖于高精确度法线。

启用高精确度GBuffer法线编码的方法:

  1. 主工具栏 中选择 编辑 > 项目设置 来打开 项目设置

  2. 引擎(Engine) 部分下的项目设置中,点击 渲染(Rendering) 选项,然后在 优化(Optimizations) 部分下将 Gbuffer格式(Gbuffer Format)默认 改为 高精确度法线

    注意:此编码需要增加GPU内存,启用此项将对项目的性能产生直接影响。

修改GBuffer格式无需重启编辑器,因此可以在不同GBuffer格式之间快速切换,查看其对反射效果的影响。下图展示了将GBuffer格式从默认改为高精确度法线后反射效果和质量的变化。

Default GBuffer Format

High Precision GBuffer Format

反射采集形状

当前有两个反射采集形状:球体和盒体。形状十分重要,因为它控制着场景的哪个部分将被采集到立方体贴图中、反射中关卡被重新投射到什么形状上,以及关卡的哪个部分可以接收来自该立方体贴图的反射(影响区域)。

球形

当前球形最为实用。其永远不会匹配被反射几何体的外形,但不含间断或角落,因此错误一致。

Sphere Shape

球形拥有橙色的影响半径,控制会受立方体贴图影响的像素、以及关卡将被重新投射到的球体。

较小的采集将覆盖较大的采集,因此在关卡周围放置较小的采集能够进行提升。

盒形

盒形的实用性十分有限,通常只用于走廊和矩形房间。其原因是只有盒体中的像素可看到反射,同时盒体中的所有几何体将投射到盒体上,在很多情况下会出现重大瑕疵。

Box Shape

选中盒体后,投射形状将拥有一个橙色预览。其只采集此盒体外 盒体过渡距离 之内的关卡。此采集的影响也会在盒体中随过渡距离淡入。

编辑反射探头

对反射探头进行编辑时,需要牢记几点才能得到想要的结果。下文将讲述这些要点以及使用者如何才能在项目中得到质量最佳的反射

更新反射探头

特别需要注意的是:反射探头不会自动保持更新。只有以下操作才会自动更新放置在关卡中的反射探头。

  • 加载地图。

  • 直接编辑一项反射采集Actor属性。

  • 构建关卡光照。

如果要使对关卡的编辑达到类似于修改光源明亮度或移动关卡几何体的效果,则需要选择一个反射采集Actor并点击 更新采集 按钮来传播修改。

在反射探头中使用一个自定义HDRI立方体贴图

反射探头不仅可以指定其将哪个立方体贴图用于反射数据,还可指定立方体贴图的大小。在之前的版本中,UE4对已烘焙立方体贴图反射探头使用的分辨率进行了硬编码。现在开发者可基于性能、内存和质量权衡来选择最满足需要的分辨率。以下对比图像显示了使用 采集场景(Captured Scene) 选项和 指定立方体贴图(Specified Cubemap) 选项之间的差异。

Captured Scene

Specified Cubemap

如要指定项目反射探头使用的自定义HDRI立方体贴图,需要执行以下选项:

  1. 首先确保有可用的HDRI立方体贴图纹理。如果项目中没有HDRI立方体贴图纹理,可在初学者内容包中选择名为 HDRI_Epic_Courtyard_Daylight 的文件。

    使用迁移 功能即可将资源从一个项目移至另一个。

  1. 选择已放置在关卡中的 反射探头 Actor,并在 反射采集(Reflection Capture) 部分下的 细节 面板中将 反射源类型(Reflection Source Type)采集场景 改为 *指定立方体贴图***

  2. 在关卡中选中反射探头,前往内容浏览器并选择希望使用的JDRI纹理。然后在反射采集Actor中 反射采集 下,将HDRI纹理从内容浏览器拖至 立方体贴图 输入。

  3. 按下 更新采集 按钮刷新反射采集Actor使用刚指定的新HDRI立方体贴图纹理。

调整反射探头分辨率

执行以下操作即可整体调整用于反射采集Actor的HDRI立方体贴图分辨率:

  1. 前往 主工具栏 并选择 编辑 > 项目设置 来打开 项目设置

  2. 在项目设置菜单中,前往 引擎 > 渲染 部分,然后查找 纹理 选项。

  3. 调整 反射采集分辨率(Reflection Capture Resolution) 选项即可增加或减少指定的HDRI立方体贴图纹理的大小。

    ARCS_02.png

    使用分辨率极高的纹理时应极其小心,由于GPU内存要求,其可能对性能产生极大影响。

下图显示了反射采集分辨率被设为 148163264128256, 5121024 时反射的效果。

拖动滑条即可查看不同分辨率对反射效果产生的影响。

调整天空光照反射分辨率

和反射探头一样,天空光照也可以定义并调整其用于反射的HDRI立方体贴图的分辨率。执行以下操作即可在UE4项目中使用此功能:

  1. 光源 部分下的 模式 面板中,选择并将一个 天空光照 拖入关卡。

  2. 选择天空光照,在 光源(Light) 部分的 细节 面板下将 源类型SLS采集场景 改为 SLS指定立方体贴图

  3. 点击 立方体贴图(Cubemap) 部分中的下拉框,并从列表中选择一个HDRI立方体贴图。

  4. 选中立方体贴图后,修改 立方体贴图分辨率 中输入的值即可调整其分辨率。

    请注意:立方体贴图分辨率数字只能是2的幂次方,如16、64、128、25、512和1024。

混合多个反射探头数据

为反射采集Actor提供不同的HDRI立方体贴图即可在多个不同立方体贴图反射之间进行混合。执行以下步骤即可在UE4项目中完成此操作:

  1. 首先将至少一个 反射探头 添加至关卡,将 反射源类型 改为 特定立方体贴图,并将HDRI纹理输入到 立方体贴图 输入。

  2. 将一个新反射探头复制或添加到关卡,并放置/调整其 影响半径,使其黄色影响半径的一部分与第一个反射探头相交。

  3. 选择新复制/创建的反射探头Actor,在 立方体贴图 部分下的 细节 面板中将HDRI立方体贴图改为其他项。

  4. 保持选中添加/复制的反射探头,前往 反射采集(Reflection Capture) 部分中的 细节 面板,然后按下 更新采集(Update Captures) 按钮进行更新,使反射使用在立方体贴图输入中输入的内容。

  5. 选择并围绕关卡移动反射探头,即可了解两个HDRI立方体贴图的混合方式。

显示

已添加反射覆盖查看模式,便于查看反射的设置效果。此查看模式将把所有法线覆盖为平滑的顶点法线,并使所有表面均拥有完整高光度且为纯平(如同镜面)。反射环境的限制和瑕疵在此模式中同样清晰可见,因此必须定期切换至光照,确认反射在普通条件下的效果(凹凸法线、多种光泽度、模糊高光度)。

Reflection Override

已新添加一些显示标签,适用于隔离光照的组件:

标签

描述

光照组件 > 漫反射

禁用漫反射后,所有光照法中的漫反射贡献均会隐藏。

光照组件 > 高光度

禁用高光度后,所有发射法中的高光度贡献均会隐藏。

光照特性 > 反射环境

这将禁用反射环境特性,但其他反射特性仍然开启(SSR、解析高光度)。

性能注意事项

反射环境开销只取决于影响屏幕上像素的采集数量。此原理与延迟光照十分相似。反射采集由其影响半径绑定,因此将被十分积极地剔除。光泽度通过立方体mipmap实现,因此尖锐或粗糙发射之间的性能差异并不大。

限制

  • 此方法通过近似模拟实现反射。具体而言,由于投射到简单形状上,物体的反射很少能与场景中的实际物体相匹配。此方法通常会在反射中创建物体的多个版本(因为多个立方体贴图将被混合在一起)。导致镜面反射的平滑表面会将错误明确地显示出来。使用细节法线贴图和粗糙度有助于打破反射和这些瑕疵。

  • 将关卡采集到立方体贴图中是一个缓慢的进程,必须在游戏进程之外进行。这意味着动态物体无法被反射,但其可接收来自静态关卡的反射。

  • 只采集关卡的漫反射来降低错误。纯高光度表面(金属)的高光度将应用,效果类似于采集中漫反射。

  • 一堵墙的两个面上拥有不同光照条件时可能出现重大泄露。一面可设置为拥有正确的反射,但其将必定会泄露到另一面。

  • 由于DX11硬件限制,拥有采集关卡的立方体贴图每面均为128,场景可一次性启用最多341个反射采集。