diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity
index db058b9..ad95b81 100644
--- a/Assets/Scenes/SampleScene.unity
+++ b/Assets/Scenes/SampleScene.unity
@@ -337,7 +337,15 @@ MonoBehaviour:
autoTcScale: 1
autoReactiveScale: 5
autoReactiveMax: 0.9
- outputMotionVectors: {fileID: 0}
+ shaders:
+ computeLuminancePyramidPass: {fileID: 7200000, guid: d253be05abcdc80428503d3e4cce3a36, type: 3}
+ reconstructPreviousDepthPass: {fileID: 7200000, guid: 4f59e5b9179d74844ae06a30ae1e0629, type: 3}
+ depthClipPass: {fileID: 7200000, guid: 20e44016ed34b0d4b8de499d1b566c69, type: 3}
+ lockPass: {fileID: 7200000, guid: a135306e6d1857e43a86ef20db2a47fe, type: 3}
+ accumulatePass: {fileID: 7200000, guid: c9b45f0ae7673694ba57a4aadfe212e9, type: 3}
+ sharpenPass: {fileID: 7200000, guid: 7aaf5cfff022de2499e9b0412f947f6c, type: 3}
+ autoGenReactivePass: {fileID: 7200000, guid: 5716b91fdaa4e9e439df6b96a796fe6e, type: 3}
+ tcrAutoGenPass: {fileID: 7200000, guid: 75cdc6ef23f08ed498d4da511923fcea, type: 3}
--- !u!114 &963194230
MonoBehaviour:
m_ObjectHideFlags: 0
diff --git a/Assets/Scripts/Core/Fsr3Upscaler.cs b/Assets/Scripts/Core/Fsr3Upscaler.cs
index 4c5dc51..90036d4 100644
--- a/Assets/Scripts/Core/Fsr3Upscaler.cs
+++ b/Assets/Scripts/Core/Fsr3Upscaler.cs
@@ -33,7 +33,7 @@ namespace FidelityFX
///
/// Creates a new FSR3 Upscaler context with standard parameters that are appropriate for the current platform.
///
- public static Fsr3UpscalerContext CreateContext(Vector2Int displaySize, Vector2Int maxRenderSize, IFsr3UpscalerCallbacks callbacks, InitializationFlags flags = 0)
+ public static Fsr3UpscalerContext CreateContext(Vector2Int displaySize, Vector2Int maxRenderSize, Fsr3UpscalerShaders shaders, IFsr3UpscalerCallbacks callbacks, InitializationFlags flags = 0)
{
if (SystemInfo.usesReversedZBuffer)
flags |= InitializationFlags.EnableDepthInverted;
@@ -51,6 +51,7 @@ namespace FidelityFX
Flags = flags,
DisplaySize = displaySize,
MaxRenderSize = maxRenderSize,
+ Shaders = shaders,
Callbacks = callbacks,
};
@@ -166,6 +167,7 @@ namespace FidelityFX
public InitializationFlags Flags;
public Vector2Int MaxRenderSize;
public Vector2Int DisplaySize;
+ public Fsr3UpscalerShaders Shaders;
public IFsr3UpscalerCallbacks Callbacks;
}
diff --git a/Assets/Scripts/Core/Fsr3UpscalerCallbacks.cs b/Assets/Scripts/Core/Fsr3UpscalerCallbacks.cs
index 01e974b..5b2c89c 100644
--- a/Assets/Scripts/Core/Fsr3UpscalerCallbacks.cs
+++ b/Assets/Scripts/Core/Fsr3UpscalerCallbacks.cs
@@ -28,9 +28,6 @@ namespace FidelityFX
///
public interface IFsr3UpscalerCallbacks
{
- ComputeShader LoadComputeShader(string name);
- void UnloadComputeShader(ComputeShader shader);
-
///
/// Apply a mipmap bias to in-game textures to prevent them from becoming blurry as the internal rendering resolution lowers.
/// This will need to be customized on a per-game basis, as there is no clear universal way to determine what are "in-game" textures.
@@ -52,16 +49,6 @@ namespace FidelityFX
{
protected float CurrentBiasOffset = 0;
- public virtual ComputeShader LoadComputeShader(string name)
- {
- return Resources.Load(name);
- }
-
- public virtual void UnloadComputeShader(ComputeShader shader)
- {
- Resources.UnloadAsset(shader);
- }
-
public virtual void ApplyMipmapBias(float biasOffset)
{
if (float.IsNaN(biasOffset) || float.IsInfinity(biasOffset))
diff --git a/Assets/Scripts/Core/Fsr3UpscalerContext.cs b/Assets/Scripts/Core/Fsr3UpscalerContext.cs
index 61722d5..da02d9f 100644
--- a/Assets/Scripts/Core/Fsr3UpscalerContext.cs
+++ b/Assets/Scripts/Core/Fsr3UpscalerContext.cs
@@ -42,7 +42,7 @@ namespace FidelityFX
private Fsr3UpscalerPass _reconstructPreviousDepthPass;
private Fsr3UpscalerPass _lockPass;
private Fsr3UpscalerPass _accumulatePass;
- private Fsr3UpscalerPass _rcasPass;
+ private Fsr3UpscalerPass _sharpenPass;
private Fsr3UpscalerPass _computeLuminancePyramidPass;
private Fsr3UpscalerPass _generateReactivePass;
private Fsr3UpscalerPass _tcrAutogeneratePass;
@@ -101,7 +101,7 @@ namespace FidelityFX
_depthClipPass = new Fsr3UpscalerDepthClipPass(_contextDescription, _resources, _upscalerConstantsBuffer);
_lockPass = new Fsr3UpscalerLockPass(_contextDescription, _resources, _upscalerConstantsBuffer);
_accumulatePass = new Fsr3UpscalerAccumulatePass(_contextDescription, _resources, _upscalerConstantsBuffer);
- _rcasPass = new Fsr3UpscalerRcasPass(_contextDescription, _resources, _upscalerConstantsBuffer, _rcasConstantsBuffer);
+ _sharpenPass = new Fsr3UpscalerSharpenPass(_contextDescription, _resources, _upscalerConstantsBuffer, _rcasConstantsBuffer);
_generateReactivePass = new Fsr3UpscalerGenerateReactivePass(_contextDescription, _resources, _generateReactiveConstantsBuffer);
_tcrAutogeneratePass = new Fsr3UpscalerTcrAutogeneratePass(_contextDescription, _resources, _upscalerConstantsBuffer, _tcrAutogenerateConstantsBuffer);
}
@@ -111,7 +111,7 @@ namespace FidelityFX
DestroyPass(ref _tcrAutogeneratePass);
DestroyPass(ref _generateReactivePass);
DestroyPass(ref _computeLuminancePyramidPass);
- DestroyPass(ref _rcasPass);
+ DestroyPass(ref _sharpenPass);
DestroyPass(ref _accumulatePass);
DestroyPass(ref _lockPass);
DestroyPass(ref _reconstructPreviousDepthPass);
@@ -258,7 +258,7 @@ namespace FidelityFX
const int threadGroupWorkRegionDimRcas = 16;
int threadGroupsX = (Screen.width + threadGroupWorkRegionDimRcas - 1) / threadGroupWorkRegionDimRcas;
int threadGroupsY = (Screen.height + threadGroupWorkRegionDimRcas - 1) / threadGroupWorkRegionDimRcas;
- _rcasPass.ScheduleDispatch(commandBuffer, dispatchParams, frameIndex, threadGroupsX, threadGroupsY);
+ _sharpenPass.ScheduleDispatch(commandBuffer, dispatchParams, frameIndex, threadGroupsX, threadGroupsY);
}
_resourceFrameIndex = (_resourceFrameIndex + 1) % MaxQueuedFrames;
diff --git a/Assets/Scripts/Core/Fsr3UpscalerPass.cs b/Assets/Scripts/Core/Fsr3UpscalerPass.cs
index bb7f746..e1dc225 100644
--- a/Assets/Scripts/Core/Fsr3UpscalerPass.cs
+++ b/Assets/Scripts/Core/Fsr3UpscalerPass.cs
@@ -50,26 +50,24 @@ namespace FidelityFX
public virtual void Dispose()
{
- UnloadComputeShader();
}
public abstract void ScheduleDispatch(CommandBuffer commandBuffer, Fsr3Upscaler.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY);
- protected void LoadComputeShader(string name)
+ protected void InitComputeShader(string passName, ComputeShader shader)
{
- LoadComputeShader(name, ContextDescription.Flags, ref ComputeShader, out KernelIndex);
+ InitComputeShader(passName, shader, ContextDescription.Flags);
}
- private void LoadComputeShader(string name, Fsr3Upscaler.InitializationFlags flags, ref ComputeShader shaderRef, out int kernelIndex)
+ private void InitComputeShader(string passName, ComputeShader shader, Fsr3Upscaler.InitializationFlags flags)
{
- if (shaderRef == null)
+ if (shader == null)
{
- shaderRef = ContextDescription.Callbacks.LoadComputeShader(name);
- if (shaderRef == null)
- throw new MissingReferenceException($"Shader '{name}' could not be loaded! Please ensure it is included in the project correctly.");
+ throw new MissingReferenceException($"Shader for FSR3 Upscaler '{passName}' could not be loaded! Please ensure it is included in the project correctly.");
}
- kernelIndex = shaderRef.FindKernel("CS");
+ ComputeShader = shader;
+ KernelIndex = ComputeShader.FindKernel("CS");
bool useLut = false;
#if UNITY_2022_1_OR_NEWER // This will also work in 2020.3.43+ and 2021.3.14+
@@ -80,34 +78,20 @@ namespace FidelityFX
#endif
// This matches the permutation rules from the CreatePipeline* functions
- if ((flags & Fsr3Upscaler.InitializationFlags.EnableHighDynamicRange) != 0) shaderRef.EnableKeyword("FFX_FSR3UPSCALER_OPTION_HDR_COLOR_INPUT");
- if ((flags & Fsr3Upscaler.InitializationFlags.EnableDisplayResolutionMotionVectors) == 0) shaderRef.EnableKeyword("FFX_FSR3UPSCALER_OPTION_LOW_RESOLUTION_MOTION_VECTORS");
- if ((flags & Fsr3Upscaler.InitializationFlags.EnableMotionVectorsJitterCancellation) != 0) shaderRef.EnableKeyword("FFX_FSR3UPSCALER_OPTION_JITTERED_MOTION_VECTORS");
- if ((flags & Fsr3Upscaler.InitializationFlags.EnableDepthInverted) != 0) shaderRef.EnableKeyword("FFX_FSR3UPSCALER_OPTION_INVERTED_DEPTH");
- if (useLut) shaderRef.EnableKeyword("FFX_FSR3UPSCALER_OPTION_REPROJECT_USE_LANCZOS_TYPE");
- if ((flags & Fsr3Upscaler.InitializationFlags.EnableFP16Usage) != 0) shaderRef.EnableKeyword("FFX_HALF");
+ if ((flags & Fsr3Upscaler.InitializationFlags.EnableHighDynamicRange) != 0) ComputeShader.EnableKeyword("FFX_FSR3UPSCALER_OPTION_HDR_COLOR_INPUT");
+ if ((flags & Fsr3Upscaler.InitializationFlags.EnableDisplayResolutionMotionVectors) == 0) ComputeShader.EnableKeyword("FFX_FSR3UPSCALER_OPTION_LOW_RESOLUTION_MOTION_VECTORS");
+ if ((flags & Fsr3Upscaler.InitializationFlags.EnableMotionVectorsJitterCancellation) != 0) ComputeShader.EnableKeyword("FFX_FSR3UPSCALER_OPTION_JITTERED_MOTION_VECTORS");
+ if ((flags & Fsr3Upscaler.InitializationFlags.EnableDepthInverted) != 0) ComputeShader.EnableKeyword("FFX_FSR3UPSCALER_OPTION_INVERTED_DEPTH");
+ if (useLut) ComputeShader.EnableKeyword("FFX_FSR3UPSCALER_OPTION_REPROJECT_USE_LANCZOS_TYPE");
+ if ((flags & Fsr3Upscaler.InitializationFlags.EnableFP16Usage) != 0) ComputeShader.EnableKeyword("FFX_HALF");
// Inform the shader which render pipeline we're currently using
var pipeline = GraphicsSettings.currentRenderPipeline;
if (pipeline != null && pipeline.GetType().Name.Contains("HDRenderPipeline"))
{
- shaderRef.EnableKeyword("UNITY_FSR3UPSCALER_HDRP");
+ ComputeShader.EnableKeyword("UNITY_FSR3UPSCALER_HDRP");
}
}
-
- private void UnloadComputeShader()
- {
- UnloadComputeShader(ref ComputeShader);
- }
-
- private void UnloadComputeShader(ref ComputeShader shaderRef)
- {
- if (shaderRef == null)
- return;
-
- ContextDescription.Callbacks.UnloadComputeShader(shaderRef);
- shaderRef = null;
- }
}
internal class Fsr3UpscalerComputeLuminancePyramidPass : Fsr3UpscalerPass
@@ -119,7 +103,7 @@ namespace FidelityFX
{
_spdConstants = spdConstants;
- LoadComputeShader("FSR3/ffx_fsr3upscaler_compute_luminance_pyramid_pass");
+ InitComputeShader("compute_luminance_pyramid_pass", contextDescription.Shaders.computeLuminancePyramidPass);
}
public override void ScheduleDispatch(CommandBuffer commandBuffer, Fsr3Upscaler.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY)
@@ -144,7 +128,7 @@ namespace FidelityFX
public Fsr3UpscalerReconstructPreviousDepthPass(Fsr3Upscaler.ContextDescription contextDescription, Fsr3UpscalerResources resources, ComputeBuffer constants)
: base(contextDescription, resources, constants)
{
- LoadComputeShader("FSR3/ffx_fsr3upscaler_reconstruct_previous_depth_pass");
+ InitComputeShader("reconstruct_previous_depth_pass", contextDescription.Shaders.reconstructPreviousDepthPass);
}
public override void ScheduleDispatch(CommandBuffer commandBuffer, Fsr3Upscaler.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY)
@@ -172,7 +156,7 @@ namespace FidelityFX
public Fsr3UpscalerDepthClipPass(Fsr3Upscaler.ContextDescription contextDescription, Fsr3UpscalerResources resources, ComputeBuffer constants)
: base(contextDescription, resources, constants)
{
- LoadComputeShader("FSR3/ffx_fsr3upscaler_depth_clip_pass");
+ InitComputeShader("depth_clip_pass", contextDescription.Shaders.depthClipPass);
}
public override void ScheduleDispatch(CommandBuffer commandBuffer, Fsr3Upscaler.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY)
@@ -207,7 +191,7 @@ namespace FidelityFX
public Fsr3UpscalerLockPass(Fsr3Upscaler.ContextDescription contextDescription, Fsr3UpscalerResources resources, ComputeBuffer constants)
: base(contextDescription, resources, constants)
{
- LoadComputeShader("FSR3/ffx_fsr3upscaler_lock_pass");
+ InitComputeShader("lock_pass", contextDescription.Shaders.lockPass);
}
public override void ScheduleDispatch(CommandBuffer commandBuffer, Fsr3Upscaler.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY)
@@ -230,7 +214,7 @@ namespace FidelityFX
public Fsr3UpscalerAccumulatePass(Fsr3Upscaler.ContextDescription contextDescription, Fsr3UpscalerResources resources, ComputeBuffer constants)
: base(contextDescription, resources, constants)
{
- LoadComputeShader("FSR3/ffx_fsr3upscaler_accumulate_pass");
+ InitComputeShader("accumulate_pass", contextDescription.Shaders.accumulatePass);
#if UNITY_2021_2_OR_NEWER
_sharpeningKeyword = new LocalKeyword(ComputeShader, SharpeningKeyword);
#endif
@@ -286,16 +270,16 @@ namespace FidelityFX
}
}
- internal class Fsr3UpscalerRcasPass : Fsr3UpscalerPass
+ internal class Fsr3UpscalerSharpenPass : Fsr3UpscalerPass
{
private readonly ComputeBuffer _rcasConstants;
- public Fsr3UpscalerRcasPass(Fsr3Upscaler.ContextDescription contextDescription, Fsr3UpscalerResources resources, ComputeBuffer constants, ComputeBuffer rcasConstants)
+ public Fsr3UpscalerSharpenPass(Fsr3Upscaler.ContextDescription contextDescription, Fsr3UpscalerResources resources, ComputeBuffer constants, ComputeBuffer rcasConstants)
: base(contextDescription, resources, constants)
{
_rcasConstants = rcasConstants;
- LoadComputeShader("FSR3/ffx_fsr3upscaler_rcas_pass");
+ InitComputeShader("rcas_pass", contextDescription.Shaders.sharpenPass);
}
public override void ScheduleDispatch(CommandBuffer commandBuffer, Fsr3Upscaler.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY)
@@ -323,7 +307,7 @@ namespace FidelityFX
{
_generateReactiveConstants = generateReactiveConstants;
- LoadComputeShader("FSR3/ffx_fsr3upscaler_autogen_reactive_pass");
+ InitComputeShader("autogen_reactive_pass", contextDescription.Shaders.autoGenReactivePass);
}
public override void ScheduleDispatch(CommandBuffer commandBuffer, Fsr3Upscaler.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY)
@@ -355,7 +339,7 @@ namespace FidelityFX
{
_tcrAutogenerateConstants = tcrAutogenerateConstants;
- LoadComputeShader("FSR3/ffx_fsr3upscaler_tcr_autogen_pass");
+ InitComputeShader("tcr_autogen_pass", contextDescription.Shaders.tcrAutoGenPass);
}
public override void ScheduleDispatch(CommandBuffer commandBuffer, Fsr3Upscaler.DispatchDescription dispatchParams, int frameIndex, int dispatchX, int dispatchY)
diff --git a/Assets/Scripts/Core/Fsr3UpscalerShaders.cs b/Assets/Scripts/Core/Fsr3UpscalerShaders.cs
new file mode 100644
index 0000000..9d9fa4d
--- /dev/null
+++ b/Assets/Scripts/Core/Fsr3UpscalerShaders.cs
@@ -0,0 +1,60 @@
+using System;
+using UnityEngine;
+
+namespace FidelityFX
+{
+ ///
+ /// All the compute shaders used by the FidelityFX Super Resolution 3 (FSR3) Upscaler.
+ ///
+ [Serializable]
+ public class Fsr3UpscalerShaders
+ {
+ ///
+ /// The compute shader used by the luminance pyramid computation pass.
+ ///
+ public ComputeShader computeLuminancePyramidPass;
+
+ ///
+ /// The compute shader used by the previous depth reconstruction pass.
+ ///
+ public ComputeShader reconstructPreviousDepthPass;
+
+ ///
+ /// The compute shader used by the depth clip pass.
+ ///
+ public ComputeShader depthClipPass;
+
+ ///
+ /// The compute shader used by the lock pass.
+ ///
+ public ComputeShader lockPass;
+
+ ///
+ /// The compute shader used by the accumulation pass.
+ ///
+ public ComputeShader accumulatePass;
+
+ ///
+ /// The compute shader used by the RCAS sharpening pass.
+ ///
+ public ComputeShader sharpenPass;
+
+ ///
+ /// The compute shader used to auto-generate a reactive mask.
+ ///
+ public ComputeShader autoGenReactivePass;
+
+ ///
+ /// The compute shader used to auto-generate a transparency & composition mask.
+ ///
+ public ComputeShader tcrAutoGenPass;
+
+ ///
+ /// Returns a copy of this class and its contents.
+ ///
+ public Fsr3UpscalerShaders Clone()
+ {
+ return (Fsr3UpscalerShaders)MemberwiseClone();
+ }
+ }
+}
diff --git a/Assets/Scripts/Core/Fsr3UpscalerShaders.cs.meta b/Assets/Scripts/Core/Fsr3UpscalerShaders.cs.meta
new file mode 100644
index 0000000..3c446ad
--- /dev/null
+++ b/Assets/Scripts/Core/Fsr3UpscalerShaders.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: db26e15a33db6ab42a38daab0ba2712f
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Fsr3UpscalerImageEffect.cs b/Assets/Scripts/Fsr3UpscalerImageEffect.cs
index 63a880f..1d50cab 100644
--- a/Assets/Scripts/Fsr3UpscalerImageEffect.cs
+++ b/Assets/Scripts/Fsr3UpscalerImageEffect.cs
@@ -98,8 +98,8 @@ namespace FidelityFX
[Range(0, 1)] public float autoReactiveMax = 0.9f;
}
- [Header("Slave cameras")]
- public Fsr3UpscalerCameraHelper[] cameraStack;
+ [SerializeField]
+ private Fsr3UpscalerShaders shaders;
private Fsr3UpscalerContext _context;
private Vector2Int _maxRenderSize;
@@ -159,26 +159,10 @@ namespace FidelityFX
CreateFsrContext();
CreateCommandBuffers();
-
- if (cameraStack != null)
- {
- foreach (var cameraHelper in cameraStack)
- {
- cameraHelper.enabled = true;
- }
- }
}
private void OnDisable()
{
- if (cameraStack != null)
- {
- foreach (var cameraHelper in cameraStack)
- {
- cameraHelper.enabled = false;
- }
- }
-
DestroyCommandBuffers();
DestroyFsrContext();
@@ -202,7 +186,7 @@ namespace FidelityFX
if (enableAutoExposure) flags |= Fsr3Upscaler.InitializationFlags.EnableAutoExposure;
if (UsingDynamicResolution()) flags |= Fsr3Upscaler.InitializationFlags.EnableDynamicResolution;
- _context = Fsr3Upscaler.CreateContext(_displaySize, _maxRenderSize, Callbacks, flags);
+ _context = Fsr3Upscaler.CreateContext(_displaySize, _maxRenderSize, shaders, Callbacks, flags);
_prevDisplaySize = _displaySize;
_prevQualityMode = qualityMode;
@@ -271,15 +255,6 @@ namespace FidelityFX
OnDisable();
OnEnable();
}
-
- if (cameraStack != null)
- {
- int numCams = cameraStack.Length;
- for (int i = 0; i < numCams; ++i)
- {
- cameraStack[i].qualityMode = qualityMode;
- }
- }
}
public void ResetHistory()