找回密码
 立即注册
查看: 633|回复: 0

【技术精讲】FSR2.1 UE插件升级

[复制链接]
发表于 2022-11-12 07:20 | 显示全部楼层 |阅读模式



发布FSR 2.1的同时,我们也升级了FSR 2 UE插件,不仅全面优化了插件,还在其中包含了两个可以提高视觉保真度的补丁。这篇博文将着重讨论这些补丁重点解决的问题,以及开发者如何将其用于自己的项目中。
第一部分 改善树叶渲染效果
在Unreal Engine中,制作树叶动画最常见的一种方法就是利用一个材质中的World Position Offset来将轻微的动画添加到几何物体中,无需依靠完整的动画和Skeletal Mesh渲染。这样就会把每一个顶点直接做成动画,只要物体本身不移动,就默认不会产生任何的运动矢量。
就FSR 2这样的图像放大工具而言,这一做法可能会产生次优的放大结果,因为算法不能解释树叶的运动,会导致历史样本加权不正确而产生重影。FSR 2插件能够启用控制台变量r.VertexDeformationOutputsVelocity (<= 4.27) 或者r.Velocity.EnableVertexDeformation (>= 5.0) ,只要使用材质材质的对象具备“Stationary”或“Movable”移动性,就能够强制这些材质材质写入运动矢量。
由于开发者并不打算移动那些移动性被设置为“Static”的对象或将其制作成动画,所以Unreal Engine有所优化,不会计算这些对象的运动矢量。
这一问题对于Unreal Engine中的默认图像放大工具来说并不明显,因为其算法正是用来处理WPO提供的细微运动。不过,FSR 2对游戏提供的运动矢量的状态呈现和保真度更为敏感。
因此,有必要:

  • 更改项目以启用r.BasePassOutputsVelocity引擎设置。
  • 或者更改编辑器中的对象移动性以及修改材质以强制生成运动矢量。
启用r.BasePassOutputsVelocity 力量速度生成,使其发生在base pass而非单独的pass中,FSR 2插件启用r.BasePassForceOutputsVelocity ,确保所有对象都渲染速度,来避免以上问题。不论这些对象是否使用WPO材质,以上做法确实增加了所有对象的GPU工作量。
为了更容易实现最佳效果,现在的FSR 2插件包含了可以修改引擎 的ImproveStaticWPO.补丁,使引擎可以不考虑对象的移动性设置,自动为使用WPO材质的所有对象生成运动矢量。
示例
以“一个男孩和他的风筝”为例,Unreal Engine 4.2中的画面是这样的:
TAAU


FSR 2.0.1


接近1:1像素视图(截图为jpeg文件,会产生压缩):
TAAU


FSR 2.0.1


默认使用FSR 2时,距离镜头最近的草地呈模糊状态。
FSR 2插件已经启用了控制台变量r.VertexDeformationOutputsVelocity  (<= 4.27)或者r.Velocity.EnableVertexDeformation  (>= 5.0) 来强制WPO材质渲染速度,但是可视化速度数据表明这些对象并没有渲染速度。
未安装补丁的UE4 4.27速度数据:
速度数据


FSR 2.0.1


在Base-Pass中输出速度方面的改进
该项目中默认启用r.BasePassOutputsVelocity 设置,即在base-pass阶段写入速度数据。这会稍微改变引擎行为,并允许FSR 2.1插件也启用r.BasePassForceOutputsVelocity 设置,然后为屏幕上的所有对象产生速度数据,确保FSR 2具有所需的运动矢量。


未安装补丁的UE4 4.27 FSR2.1 - 速度插图
已经启用r.BasePassOutputsVelocity 的项目会默认这种行为,默认确保最佳质量。不过,这确实增加了所需的GPU工作量,因为所有对象都在产生速度数据,无论是不是必要。
尚未启用r.BasePassOutputsVelocity 但使用大量World-Position-Offset材质的项目应该考虑启用此设置并对其进行剖析,因为在许多情况下,这样设置不需要损耗大量资源就能充分发挥作用。
这是使用二进制版本的编辑器时最简单的做法。
通过修改内容进行提升
我们也可以通过修改内容来解决其中一些问题,而不是依靠r.BasePassOutputsVelocity 或是源代码补丁。使用二进制版本的编辑器时,修改内容是提高质量的唯一替代方案,因为补丁需要修改Unreal Engine代码。
针对不同的项目和涉及的资源类型可以进行多样的修改。还是以“一个男孩和他的风筝”为例,为了确保尽可能多的树叶生成运动矢量,可以采用几个操作来修改项目和内容。
项目设置
要想使内容修改有效,就必须修改项目设置。使用r.BasePassOutputsVelocity 却不启用或者不允许FSR 2.1启用r.BasePassForceOutputsVelocity 可能会导致运动矢量丢失,即使所有对象都被设置为“Stationary”或“Movable”,所以如果需要为少量的对象渲染速度,就必须首先修改项目设置。
若要禁用此设置,请打开Project Settings > Engine > Rendering > Optimisations,并禁用“Output velocities during base pass”。




地形草层
该demo使用在地形材质中采样的草层,在运行时利用Unreal Engine代码中的“Static”移动性设置创建Hierarchical Instanced Static Mesh组件。FSR 2.1插件的设置中有一个新的选项,可以强制这些组件在运行时的移动性为“Stationary”。
要启用此设置,打开Project Settings>Plugins>FidelityFX Super Resolution2.0,然后选择“All Instances”或“Instances with World-Position-Offset”。前者CPU端开销更低,后者可能占用更多的CPU时间,但GPU端牺牲较小。


启用此设置可确保在起始场景中最靠近镜头的大部分草地渲染速度,这对视觉结果有显著影响。不过,由于部分对象没有作为草层的一部分进行渲染,速度数据上仍然存在一些差异,需要进行额外的工作。
Velocity


Scene


静态网格
在后面的demo中,仍然有些树没有渲染速度,许多树是规则的静态网格。


编辑时,可以在编辑器视图中选择视窗中的选项来使用FSR 2:


将这些网格改为“Stationary”会强制它们在FSR 2中呈现最佳渲染所需的速度,但仍有许多网格没有渲染速度。




植被
这些是Instanced Foliage Actor的一部分,需要修改用于在植被系统中生成它们的蓝图。将编辑器切换到植被模式就会显示当前层所使用的蓝图和静态网格。


打开这些蓝图并将移动性从Static更改为Stationary,保存蓝图,该层将开始渲染速度。






我们也可以打开Procedural Foliage System,上面有更多生成森林的蓝图。




这些蓝图界定了树叶系统如何在森林中生成Instanced Static Meshes,要让树叶产生速度,就需要改变每个蓝图的移动性。


抖动LOD过渡
当r.BasePassOutputsVelocity被禁用时,可以选择在使用World-Position-Offset的材质上启用抖动LOD过渡选项。在这种情况下,引擎会在LOD过渡的边界处使用两个LOD之间的抖动模式来渲染base pass,这能够减少LOD级别之间的“震感”。
当r.BasePassOutputsVelocity被禁用时,速度将以单独的pass呈现,这可能会导致速度和抖动的base pass之间的不匹配,从而混淆FSR 2升级算法。下面的屏幕截图就是一个示例:


要解决这一问题,需要启用r.BasePassOutputsVelocity或禁用相关材料中的抖动LOD过渡,如下所示:


材质实例
当使用UE4 4.27及更早版本的材质实例时,有必要反复检查材质系统是否正确导出了使用World-Position-Offset的材质。使用Unreal Engine5则不必这么做。
当使用默认值为0的Material Instance Parameter来控制是否在材质中使用World-Position-Offset时,会出现这一问题,因为系统会根据材质的默认输入而非材质实例来评估是否使用WPO。


带实例参数的材质图


启用WPO的材质实例
材质默认输入将“Animate”的值设置为false,而材质实例将“Animate”设置为true,使用材质实例的对象虽然被做成了动画,但并不渲染速度。


简单地将默认值改为true意味着允许材质系统假定使用了WPO并渲染速度。




结果
一旦所有的内容都进行了适当修改,结果中的重影就会减少,但是CPU和GPU的行为会发生变化。

  • 将对象设置为Stationary而不是Static可能会让CPU和GPU的开销更高一点,因为边界更新、写入速度输出的对象数量会有所增加
  • 在静态光的照射下,物体的亮度也可能发生微妙的变化,因为静态光的移动性由Static变为了Stationary。
更改这些内容时,最好只更改重影明显的部分,尽可能多地保留Static以减少行为上的变化。
应用补丁
对于从源代码构建补丁的开发者,可以通过以下步骤应用补丁:
Git
在支持GIT的终端中:

  • 下载FSR 2插件并解压缩。
  • 克隆Unreal Engine存储库:


  • git 克隆 <repo-url>,其中<repo-url>应该替换为源存储库的URL。

  • 导航到Unreal Engine的根目录:


  • cd UnrealEngine

  • 检出需要应用补丁的Unreal Engine版本:


  • git checkout <version>,其中<version>应替换为4.26、4.27或5.0等版本号。

  • 将合适的FSR 2插件版本安装到Engine/Plugins/Runtime/AMD。
  • 使用Git应用补丁:


  • git am <path/to/patch>,将<path/to/patch>替换为适用于该引擎版本的ImproveStaticWPO.补丁文件路径。

  • 构建引擎并检查补丁功能是否无误。
  • 将该变动设置为上游:


  • 推送到远程库
其他SCMs

  • 下载FSR 2插件并解压。
  • 从SCM中克隆Unreal Engine,并根据需要设置正确的Unreal Engine版本。
  • 将对应的FSR2插件版本安装到Engine/Plugins/Runtime/AMD目录。
  • 导航到Unreal Engine根目录:


  • cd UnrealEngine

  • 使用“patch”命令行工具修补文件:


  • 用适用于引擎版本的patch -p1 < <path/to/patch> 来替换ImproveStaticWPO.patch文件路径中的 <path/to/patch>

  • 构建引擎并检查补丁功能是否无误。
  • 提交到SCM。
补丁结果
在禁用r.BasePassOutputsVelocity 的前提下,应用该补丁可以更改引擎行为,从而为使用WPO材质的对象渲染速度,即使这些对象被确定为Static。与内容更改一样,启用此选项可能导致一些静态网格生不生成运动矢量。现在允许所有WPO材质为FSR 2生成运动矢量。补丁并没有改变组件的移动性,所以行为上唯一的变化就是增加了渲染速度,这会增加CPU和GPU的开销。与更改内容的移动性设置不同,补丁不会更改受影响对象的行为或渲染效果。


有了运动矢量,FSR 2图像放大算法让靠近镜头的草地产生了更好的效果。
下图为4K截图缩小到1600像素宽,以供比较。
UE 4.27 FSR 2.0.1


安装了补丁的 UE 4.27 FSR 2.1


下图:4K截图1:1像素对比。
UE4.27 FSR 2.0.1


安装了补丁的 UE 4.27 FSR 2.1


<hr/>第二部分 使材质具有反应性
FSR 2.1插件的另一个升级之处是增加了一个选项,使特定的shading模型写入reactive mask。这在材质动画中很有用,可能会让图像放大工具产生次优结果,因为移动像素不存在运动矢量。
当动画材质被精细的网格或格栅遮挡时,这一点尤其明显,因为这会让没有运动矢量的算法无法准确识别正在运动的内容。
示例
下面是 ShooterGame 示例的修改版本,其中一个网格放置在一些动画广告牌前面,这些广告牌被修改为垂直滚动而不是水平滚动模式,使用Default Lit Shading模型并渲染为不透明。这使我们能更容易地看到 FSR 2 相对于默认图像放大工具可能发生的重影。
TAAU


FSR 2.0.1


下图:1:1大小的4K截屏像素比较。
TAAU


FSR 2.0.1


解决方案
现在的 FSR 2.1 提供了一些选项,可以通过将诸如此类的动画材质写入减少重影的reactivity mask来缓解此问题。
最简单的方法是将 Material shading-model 设置为仍然可以渲染但不在场景中以其他方式使用的模型。对于这种情况,Subsurface Profile没有其他用途,因此可以应用在材质上。


一旦为材质选中shading模型,就在 Project Settings > Plugins > FidelityFX Super Resolution 2.1 的“Reactive Shading Model”下拉菜单中选择所选的shading模型,以便将其写入reactive mask并设置“Force value for Reactive Shading Model”。




启用这些设置后,广告牌材质在创建reactive mask的FSR 2 pass中被识别,“Force value for Reactive Shading Model”的值被写入reactive mask。
下面是UE 4.27的比较截图,上图显示了FSR 2.1的默认值,下图显示了“Reactive Shading Model”和“Reactive Shading Model的强制值”。
FSR 2.1 default


上述内容启用后


下图为上面4K截图的1:1像素比较。
FSR 2.1 default


上述内容启用后


从比较结果可以看出,广告牌不再沿运动轴出现重影,并且始终保持清晰。
在下面使用UE 4.27的截图比较中,上面的“Reactive Shading Model强制值”设置为0,下面的设置为1。
Value = 0


Value = 1


附加Shading模型补丁
对于无法以这种方式重新调整shading模型用途的项目,现在有一个可选的引擎补丁文件  LitReactiveShadingModel.patch,随 FSR 2 插件一起提供,该插件添加了一个新的“Lit Reactive”shading模型。这种新的shading模型与“Default Lit”的操作相同,不过该模型还允许开发者将值写入CustomData0.x通道,然后将由 FSR 2 插件中的 CreateReactiveMask pass传递使用。
应用补丁
从源代码构建的开发者可以使用以下步骤应用补丁。
Git
在支持GIT的终端中:

  • 下载FSR 2插件并解压缩。
  • 克隆Unreal Engine存储库:


  • git克隆<repro-url> git 克隆 <repo-url>,其中<repo-url>应该替换为源存储库的URL)

  • 导航到Unreal Engine的根目录:


  • cd UnrealEngine

  • 检出需要应用补丁的Unreal Engine版本:


  • git checkout <version>,其中<version>应替换为4.26、4.27、5.0等版本号。

  • 将合适的FSR 2插件版本安装到Engine/Plugins/Runtime/AMD。
  • 使用Git应用补丁:


  • 将<path/to/patch>替换为适用于该引擎版本的LitReactiveShadingModel.补丁文件路径git am <path/to/patch>。

  • 构建引擎并检查补丁功能是否无误。
  • 将该变动设置为上游:


  • 推送到远程库
其他SCMs

  • 下载FSR 2插件并解压缩。
  • 从SCM中克隆Unreal Engine,并根据需要设置正确的Unreal Engine版本。
  • 将合适的FSR 2插件版本安装到Engine/Plugins/Runtime/AMD。
  • 导航到Unreal Engine的根目录:


  • cd UnrealEngine

  • 使用“patch”命令行工具修补文件:


  • 将<path/to/patch>替换为适用于该引擎版本的LitReactiveShadingModel.补丁文件路径patch -p1 < <path/to/patch>。

  • 构建引擎并检查补丁功能是否无误。
  • 提交到SCM。
使用补丁
一旦应用并重建引擎,就可以在材质编辑器中选择“Lit Reactive”shading模型:


选择后,可以将值传递给Custom Data 0输出:


然后还需要在 FSR 2 设置中选择“Lit Reactive”作为“Reactive Shading Model”,并通过将其设置为0.0来禁用“Force value for Reactive Shading Model”。


在FSR 2设置中选择Lit Reactive作为Reactive Shading Model


禁用Reactive Shading Model的强制值,将其设置为0
在该配置中,只有使用新shading模型的特定资源将写入reactive mask并写入材质图中指定的值,同时仍提供识别区域改进的动画材质渲染。
Lit Reactive Off


Lit Reactive On
下图为上面4K截图的1:1像素对比。
Lit Reactive Off


Lit Reactive On

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-23 20:39 , Processed in 0.094762 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表