From b7c49ea0e306b72078724ef079a107408a91fdd7 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Wed, 1 Mar 2023 17:33:05 +0100 Subject: [PATCH] Allow reactive mask generation parameters to be set from the inspector. Also set a default quality mode and reintroduced the Native quality mode, to make FSR2 into an expensive TAA + sharpen. --- Assets/Scripts/Fsr2.cs | 2 ++ Assets/Scripts/Fsr2Controller.cs | 31 +++++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/Assets/Scripts/Fsr2.cs b/Assets/Scripts/Fsr2.cs index 25cfafb..620e983 100644 --- a/Assets/Scripts/Fsr2.cs +++ b/Assets/Scripts/Fsr2.cs @@ -50,6 +50,7 @@ namespace FidelityFX return 2.0f; case QualityMode.UltraPerformance: return 3.0f; + case QualityMode.Native: default: return 1.0f; } @@ -105,6 +106,7 @@ namespace FidelityFX public enum QualityMode { + Native = 0, Quality = 1, Balanced = 2, Performance = 3, diff --git a/Assets/Scripts/Fsr2Controller.cs b/Assets/Scripts/Fsr2Controller.cs index 4c01a65..f2a9d55 100644 --- a/Assets/Scripts/Fsr2Controller.cs +++ b/Assets/Scripts/Fsr2Controller.cs @@ -13,15 +13,18 @@ namespace FidelityFX [RequireComponent(typeof(Camera))] public class Fsr2Controller : MonoBehaviour { - [SerializeField] private Fsr2.QualityMode qualityMode; + [SerializeField] private Fsr2.QualityMode qualityMode = Fsr2.QualityMode.Quality; [SerializeField] private bool performSharpenPass = true; [SerializeField, Range(0, 1)] private float sharpness = 0.8f; - [SerializeField] private bool generateReactiveMask = false; - + [Tooltip("Allow the use of half precision compute operations, potentially improving performance")] [SerializeField] private bool enableFP16 = false; + + [Header("Reactive Mask")] + [SerializeField] private bool generateReactiveMask = false; + [SerializeField] private GenerateReactiveParameters generateReactiveParameters = new GenerateReactiveParameters(); private Fsr2Context _context; private Vector2Int _renderSize; @@ -153,6 +156,18 @@ namespace FidelityFX _renderCamera.aspect = (Screen.width * _originalRect.width) / (Screen.height * _originalRect.height); _renderCamera.rect = new Rect(0, 0, _originalRect.width * _renderSize.x / _displaySize.x, _originalRect.height * _renderSize.y / _displaySize.y); + if (generateReactiveMask) + { + _genReactiveDescription.ColorOpaqueOnly = null; + _genReactiveDescription.ColorPreUpscale = null; + _genReactiveDescription.OutReactive = null; + _genReactiveDescription.RenderSize = _renderSize; + _genReactiveDescription.Scale = generateReactiveParameters.scale; + _genReactiveDescription.CutoffThreshold = generateReactiveParameters.cutoffThreshold; + _genReactiveDescription.BinaryValue = generateReactiveParameters.binaryValue; + _genReactiveDescription.Flags = generateReactiveParameters.flags; + } + _dispatchDescription.Color = null; _dispatchDescription.Depth = null; _dispatchDescription.MotionVectors = null; @@ -198,7 +213,6 @@ namespace FidelityFX if (generateReactiveMask) { - _genReactiveDescription.RenderSize = _renderSize; _dispatchCommandBuffer.GetTemporaryRT(Fsr2Pipeline.UavAutoReactive, _renderSize.x, _renderSize.y, 0, default, GraphicsFormat.R8_UNorm, 1, true); _context.GenerateReactiveMask(_genReactiveDescription, _dispatchCommandBuffer); _dispatchCommandBuffer.ReleaseTemporaryRT(Fsr2Pipeline.SrvOpaqueOnly); @@ -241,5 +255,14 @@ namespace FidelityFX // Shut up the Unity warning about not writing to the destination texture Graphics.SetRenderTarget(dest); } + + [System.Serializable] + public class GenerateReactiveParameters + { + public float scale = 1.0f; + public float cutoffThreshold = 0.2f; + public float binaryValue = 0.9f; + public Fsr2.GenerateReactiveFlags flags = Fsr2.GenerateReactiveFlags.ApplyTonemap | Fsr2.GenerateReactiveFlags.ApplyThreshold | Fsr2.GenerateReactiveFlags.UseComponentsMax; + } } }