What is this blog post series about?
When we made FSR 2.1 available, we also updated our FSR 2 Unreal Engine plugin. This update not only brings significant improvements to the plugin generally, but we’ve also provided two patches with the package which can increase visual fidelity. FSR 2.2 further improves the plugin and adds Unreal Engine 5.1 support.
This five part blog post series – this is part 2 – highlights the issues these patches address, and how you can use them in your own Unreal Engine projects.
Part 1 – Improving foliage appearance: Introduction and using the base pass for velocity generation.
→  Part 2 – Improving foliage appearance: Improvements via content changes.
Part 3 – Improving foliage appearance: Applying the ImproveStaticWPO patch.
Part 4 – Making materials reactive: How to make a specific shading model write to the reactive mask.
Part 5 – Making materials reactive: Applying the LitReactiveShadingModel patch.Â
Introducing part 2
Back in part 1, we discussed the problems with foliage appearance, and how to use the base pass for velocity generation in order to improve it.Â
Here in part 2, we discuss how to improve the foliage appearance via content changes.Â
There is a separate guide for how to use the FSR 2 Unreal Engine plugin - don't miss it! This blog series relates specifically to enhancements available with FSR 2.2, and using the patches bundled with this release.
Note: Patches to Unreal Engine do require that developers build from source, as the patches cannot be applied to the binary editor distributed by Epic. However, this blog post series also shows you how to make changes to their project settings and content to achieve the same results where possible.
Improvements to foliage via content changes
It is also possible to address some of these issues via content changes rather than relying upon r.BasePassOutputsVelocity
or the source code patch. When using the binary version of the editor, making content changes is the only other option to improve quality as the the patch requires modifying the Unreal Engine code.
The changes can be extensive depending upon the project and the types of assets involved. Continuing to use ‘A Boy and His Kite‘ as the example, there are several actions to take to change the project and content to ensure that as much of the foliage generates motion vectors as possible.
Project Settings
In order for content changes to be effective it is necessary to make changes to the project settings. Using r.BasePassOutputsVelocity
without enabling or allowing FSR 2.1 to enable r.BasePassForceOutputsVelocity
can result in missing motion vectors even when all objects are set to be Stationary or Movable. Therefore if it is necessary to render velocity for the minimum number of objects, then this must be done first.
To disable this setting open Project Settings > Engine > Rendering > Optimisations and disable Output velocities during base pass.
Landscape grass layers
The demo uses grass layers sampled in the landscape material which create Hierarchical Instanced Static Mesh components at runtime with Static mobility set in the Unreal Engine code.
For Unreal Engine 5.0 and earlier
The plugin has an option in the plugin settings to force the mobility for these components to Stationary at runtime.
To enable this setting open Project Settings > Plugins > FidelityFX Super Resolution 2.2 and then select either All Instances or Instances with World-Position-Offset. The former is lower overhead on the CPU while the latter may use more CPU time but sacrifice less on the GPU.
For Unreal Engine 5.1 and later
A new console variable r.Velocity.EnableLandscapeGrass
controls whether these components render velocity and it is enabled by default. The FSR 2.2 plugin will enable r.Velocity.EnableLandscapeGrass
if disabled to ensure correct rendering when Force Vertex Deformation To Output Velocity is enabled.
It should not be necessary to enable the Force Landscape HISM Mobility option.
Enabling this option ensures that the majority of grass nearest the camera in the starting scene renders velocity which has a significant effect on the visual result. However, there are still gaps in the velocity caused by objects not rendered as part of the grass layer and these need additional work.
Static meshes
Later in the demo there are trees that still don’t render velocity and many are regular static meshes.
When editing, it is possible to use FSR 2 in the Editor viewport by selecting the option in the viewport:
Changing these meshes to Stationary forces them to render velocity required for best rendering in FSR 2, but there are many more that still don’t.
Foliage
These are part of an Instanced Foliage Actor and require modifying the blueprint used to spawn them in the foliage system. Switching the editor to Foliage mode shows the blueprints and static meshes used in the current level.
Opening these blueprints and changing Mobility from Static to Stationary, then saving the blueprint and the level will cause them to start rendering velocity.
We can also open the Procedural Foliage System which shows us more blueprints used to generate the forest.
These blueprints define how the foliage system spawns the Instanced static meshes in the forest, and to have them generate velocity requires changing the mobility for each blueprint.
Dithered LOD Transition
Enabling the Dithered LOD Transition option on materials that use World-Position-Offset
is an issue when r.BasePassOutputsVelocity
is disabled. In this case the engine renders the base pass using a dithered pattern between two LODs at the boundaries of LOD transitions. This reduces ‘popping’ between the LOD levels.
When r.BasePassOutputsVelocity
is disabled, the velocity is rendered with a separate pass and this can result in a mismatch between the velocity and the dithered base pass which confuses the FSR 2 upscaling algorithm. The screenshot below shows an example:
To fix this requires either enabling r.BasePassOutputsVelocity
or disabling Dithered LOD Transition in the relevant materials as shown below:
Material Instances
When using Material Instances with UE4 4.27 and earlier, it is necessary to double check that the material system properly exports that the material uses World-Position-Offset
. This is not necessary for Unreal Engine 5.
The issue occurs when using a Material Instance Parameter with a default value of 0 to control whether to use World-Position-Offset
in a Material as the system will evaluate whether WPO is used based on the default inputs to the Material, not the Material Instance.
Material Graph with Instance Parameter
Material Instance that enables WPO
The Material defaults the value of Animate to false, but the Material Instance sets Animate to true. However, the object using the Material Instance does not render velocity, despite being animated.
Simply changing the default to true will allow the material system to assume that WPO is used and render velocity.
Results
Once all the content has been properly modified there will be reduced ghosting in the upscaled result, but there will be changes in the CPU and GPU behavior.
- Setting objects to Stationary rather than Static may result in slightly higher CPU and GPU overhead as the number of objects whose bounds are updated and that write to the velocity output will increase.
- There may also be subtle changes in the lighting of objects illuminated by static lights whose mobility is changed from Static to Stationary.
When making these content changes it is best to only change the content where the ghosting is apparent, leaving as much to be Static as possible to reduce these changes in behavior.
Coming up next
Continue reading in part 3 to find out how to apply the ImproveStaticWPO patch and see the results.Â
Alternatively, feel free to skip ahead to one of the other parts:
Part 1 – Improving foliage appearance: Introduction and using the base pass for velocity generation.
Part 2 – Improving foliage appearance: Improvements via content changes.
→  Part 3 – Improving foliage appearance: Applying the ImproveStaticWPO patch.
Part 4 – Making materials reactive: How to make a specific shading model write to the reactive mask.
Part 5 – Making materials reactive: Applying the LitReactiveShadingModel patch.Â
AMD FSR 2 UE plugin enhancements part 3: Improving foliage appearance with the ImproveStaticWPO patch
Find out how to apply one of our supplied Unreal Engine patches to improve upscaled foliage appearance with our FSR 2.1 plugin.
Get the Unreal Engine FSR 2 plugins now!
The package linked below contains the latest version of all our currently available UE 4/5 plugins [~600MB]
- Includes the patches referred to in this blog series.
Find out more about FSR 2 and our Unreal Engine plugin
AMD FidelityFXâ„¢ Super Resolution 2 (FSR 2)
Learn even more about our new open-source temporal upscaling solution FSR 2, and get the source code and documentation!
How to use the AMD FidelityFXâ„¢ Super Resolution 2 (FSR 2) Unreal Engine plugin
Find out how to install and configure the AMD FidelityFX Super Resolution (FSR) 2 plugin for Unreal Engine 4.26/4.27 and UE5.
Learn more about FSR and Unreal Engine
How to use AMD FidelityFXâ„¢ Super Resolution (FSR) 1.0 Unreal Engine 4 Plugin
Find out how to install and configure the AMD FidelityFX Super Resolution (FSR) 1.0 plugin for Unreal Engine 4.
AMD FidelityFXâ„¢ Super Resolution 1 (FSR 1)
AMD FidelityFX Super Resolution (FSR) is our open-source, high-quality, high-performance upscaling solution.
Unreal Engine
Develop for Unreal Engine on AMD hardware with our plugin, performance and feature patches, including FidelityFX support.
FOOTNOTE:
The information contained herein is for informational purposes only, and is subject to change without notice. While every precaution has been taken in the preparation of this document, it may contain technical inaccuracies, omissions and typographical errors, and AMD is under no obligation to update or otherwise correct this information. Advanced Micro Devices, Inc. makes no representations or warranties with respect to the accuracy or completeness of the contents of this document, and assumes no liability of any kind, including the implied warranties of noninfringement, merchantability or fitness for particular purposes, with respect to the operation or use of AMD hardware, software or other products described herein. No license, including implied or arising by estoppel, to any intellectual property rights is granted by this document. Terms and limitations applicable to the purchase or use of AMD’s products are as set forth in a signed agreement between the parties or in AMD’s Standard Terms and Conditions of Sale.
AMD, the AMD Arrow logo, FidelityFX, FidelityFX Super Resolution, FidelityFX Super Resolution 2.0 and combinations thereof are trademarks of Advanced Micro Devices, Inc. Other product names used in this publication are for identification purposes only and may be trademarks of their respective companies.
Unreal® is a trademark or registered trademark of Epic Games, Inc. in the United States of America and elsewhere.
© 2022 Advanced Micro Devices, Inc. All rights reserved.