diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity index a3712f2..66f7865 100644 --- a/Assets/Scenes/SampleScene.unity +++ b/Assets/Scenes/SampleScene.unity @@ -320,7 +320,9 @@ MonoBehaviour: performSharpenPass: 1 sharpness: 0.8 enableFP16: 0 - generateReactiveMask: 1 + reactiveMask: {fileID: 0} + transparencyAndCompositionMask: {fileID: 0} + autoGenerateReactiveMask: 1 generateReactiveParameters: scale: 1 cutoffThreshold: 0.2 diff --git a/Assets/Scripts/Fsr2Controller.cs b/Assets/Scripts/Fsr2Controller.cs index a36d7cb..9a45d78 100644 --- a/Assets/Scripts/Fsr2Controller.cs +++ b/Assets/Scripts/Fsr2Controller.cs @@ -16,20 +16,21 @@ namespace FidelityFX [SerializeField] private Fsr2.QualityMode qualityMode = Fsr2.QualityMode.Quality; [SerializeField] private bool performSharpenPass = true; - [SerializeField, Range(0, 1)] private float sharpness = 0.8f; [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; + + [Header("Reactivity, Transparency & Composition")] + [SerializeField] private Texture reactiveMask = null; + [SerializeField] private Texture transparencyAndCompositionMask = null; + [SerializeField] private bool autoGenerateReactiveMask = true; [SerializeField] private GenerateReactiveParameters generateReactiveParameters = new GenerateReactiveParameters(); [System.Serializable] public class GenerateReactiveParameters { - [Range(0, 2)] public float scale = 1.0f; + [Range(0, 10)] public float scale = 1.0f; [Range(0, 1)] public float cutoffThreshold = 0.2f; [Range(0, 1)] public float binaryValue = 0.9f; public Fsr2.GenerateReactiveFlags flags = Fsr2.GenerateReactiveFlags.ApplyTonemap | Fsr2.GenerateReactiveFlags.ApplyThreshold | Fsr2.GenerateReactiveFlags.UseComponentsMax; @@ -85,7 +86,7 @@ namespace FidelityFX _inputsCommandBuffer.SetGlobalTexture(Fsr2Pipeline.SrvInputMotionVectors, BuiltinRenderTextureType.MotionVectors); _renderCamera.AddCommandBuffer(CameraEvent.BeforeImageEffects, _inputsCommandBuffer); - if (generateReactiveMask) + if (autoGenerateReactiveMask) { _renderCamera.AddCommandBuffer(CameraEvent.BeforeForwardAlpha, _opaqueInputCommandBuffer); } @@ -96,7 +97,7 @@ namespace FidelityFX _prevDisplaySize = _displaySize; _prevQualityMode = qualityMode; - _prevGenReactiveMask = generateReactiveMask; + _prevGenReactiveMask = autoGenerateReactiveMask; } private void OnDisable() @@ -142,14 +143,14 @@ namespace FidelityFX OnEnable(); } - if (generateReactiveMask != _prevGenReactiveMask) + if (autoGenerateReactiveMask != _prevGenReactiveMask) { - if (generateReactiveMask) + if (autoGenerateReactiveMask) _renderCamera.AddCommandBuffer(CameraEvent.BeforeForwardAlpha, _opaqueInputCommandBuffer); else _renderCamera.RemoveCommandBuffer(CameraEvent.BeforeForwardAlpha, _opaqueInputCommandBuffer); - _prevGenReactiveMask = generateReactiveMask; + _prevGenReactiveMask = autoGenerateReactiveMask; } } @@ -166,7 +167,7 @@ namespace FidelityFX _renderCamera.rect = new Rect(0, 0, _originalRect.width * _renderSize.x / _displaySize.x, _originalRect.height * _renderSize.y / _displaySize.y); // Set up the parameters to auto-generate a reactive mask - if (generateReactiveMask) + if (autoGenerateReactiveMask) { _genReactiveDescription.ColorOpaqueOnly = null; _genReactiveDescription.ColorPreUpscale = null; @@ -224,7 +225,7 @@ namespace FidelityFX _dispatchCommandBuffer.Clear(); - if (generateReactiveMask) + if (autoGenerateReactiveMask) { _dispatchCommandBuffer.GetTemporaryRT(Fsr2Pipeline.UavAutoReactive, _renderSize.x, _renderSize.y, 0, default, GraphicsFormat.R8_UNorm, 1, true); _context.GenerateReactiveMask(_genReactiveDescription, _dispatchCommandBuffer); @@ -232,6 +233,15 @@ namespace FidelityFX _dispatchDescription.Reactive = Fsr2Pipeline.UavAutoReactive; } + else if (reactiveMask != null) + { + _dispatchDescription.Reactive = reactiveMask; + } + + if (transparencyAndCompositionMask != null) + { + _dispatchDescription.TransparencyAndComposition = transparencyAndCompositionMask; + } _dispatchDescription.InputResourceSize = new Vector2Int(src.width, src.height); @@ -258,7 +268,7 @@ namespace FidelityFX _dispatchCommandBuffer.ReleaseTemporaryRT(Fsr2Pipeline.UavUpscaledOutput); } - if (generateReactiveMask) + if (autoGenerateReactiveMask) { _dispatchCommandBuffer.ReleaseTemporaryRT(Fsr2Pipeline.UavAutoReactive); }