Browse Source

Added support for dynamic resolution scaling using ScalableBufferManager.

master
Nico de Poel 3 years ago
parent
commit
5236c28e7e
  1. 2
      Assets/Scenes/SampleScene.unity
  2. 16
      Assets/Scripts/Debug/DebugDumper.cs
  3. 38
      Assets/Scripts/Fsr2ImageEffect.cs
  4. 2
      ProjectSettings/ProjectSettings.asset

2
Assets/Scenes/SampleScene.unity

@ -284,7 +284,7 @@ Camera:
m_TargetEye: 3 m_TargetEye: 3
m_HDR: 1 m_HDR: 1
m_AllowMSAA: 0 m_AllowMSAA: 0
m_AllowDynamicResolution: 0
m_AllowDynamicResolution: 1
m_ForceIntoRT: 0 m_ForceIntoRT: 0
m_OcclusionCulling: 1 m_OcclusionCulling: 1
m_StereoConvergence: 10 m_StereoConvergence: 10

16
Assets/Scripts/Debug/DebugDumper.cs

@ -30,6 +30,9 @@ using UnityEngine;
public class DebugDumper : MonoBehaviour public class DebugDumper : MonoBehaviour
{ {
private Fsr2ImageEffect _fsr; private Fsr2ImageEffect _fsr;
private float _scaleFactor = 1.0f;
private float _lastScaleTime = 0f;
void Start() void Start()
{ {
@ -42,6 +45,8 @@ public class DebugDumper : MonoBehaviour
Debug.Log(sb); Debug.Log(sb);
_fsr = GetComponent<Fsr2ImageEffect>(); _fsr = GetComponent<Fsr2ImageEffect>();
ScalableBufferManager.ResizeBuffers(_scaleFactor, _scaleFactor);
} }
void Update() void Update()
@ -77,6 +82,16 @@ public class DebugDumper : MonoBehaviour
{ {
_fsr.ResetHistory(); _fsr.ResetHistory();
} }
float vertical = Input.GetAxis("Vertical");
if (vertical is < -0.3f or > 0.3f && Time.realtimeSinceStartup > _lastScaleTime + 0.5f)
{
_scaleFactor += 0.1f * Math.Sign(vertical);
_scaleFactor = Mathf.Clamp(_scaleFactor, 0.1f, 1.0f);
ScalableBufferManager.ResizeBuffers(_scaleFactor, _scaleFactor);
_lastScaleTime = Time.realtimeSinceStartup;
}
} }
private void OnGUI() private void OnGUI()
@ -93,6 +108,7 @@ public class DebugDumper : MonoBehaviour
GUILayout.Label($"FSR2: {(_fsr.enabled ? "Enabled" : "Disabled")}"); GUILayout.Label($"FSR2: {(_fsr.enabled ? "Enabled" : "Disabled")}");
GUILayout.Label($"Quality: {_fsr.qualityMode}"); GUILayout.Label($"Quality: {_fsr.qualityMode}");
GUILayout.Label($"Auto-exposure: {(_fsr.enableAutoExposure ? "Enabled" : "Disabled")}"); GUILayout.Label($"Auto-exposure: {(_fsr.enableAutoExposure ? "Enabled" : "Disabled")}");
GUILayout.Label($"Scale: {_scaleFactor:0.00}");
if (Input.GetButton("Jump")) if (Input.GetButton("Jump"))
{ {
GUILayout.Label("Reset"); GUILayout.Label("Reset");

38
Assets/Scripts/Fsr2ImageEffect.cs

@ -186,6 +186,7 @@ namespace FidelityFX
if (_renderCamera.allowHDR) flags |= Fsr2.InitializationFlags.EnableHighDynamicRange; if (_renderCamera.allowHDR) flags |= Fsr2.InitializationFlags.EnableHighDynamicRange;
if (enableFP16) flags |= Fsr2.InitializationFlags.EnableFP16Usage; if (enableFP16) flags |= Fsr2.InitializationFlags.EnableFP16Usage;
if (enableAutoExposure) flags |= Fsr2.InitializationFlags.EnableAutoExposure; if (enableAutoExposure) flags |= Fsr2.InitializationFlags.EnableAutoExposure;
if (UsingDynamicResolution()) flags |= Fsr2.InitializationFlags.EnableDynamicResolution;
_context = Fsr2.CreateContext(_displaySize, _renderSize, Callbacks, flags); _context = Fsr2.CreateContext(_displaySize, _renderSize, Callbacks, flags);
@ -292,7 +293,8 @@ namespace FidelityFX
_opaqueInputCommandBuffer.Clear(); _opaqueInputCommandBuffer.Clear();
if (autoGenerateReactiveMask || autoGenerateTransparencyAndComposition) if (autoGenerateReactiveMask || autoGenerateTransparencyAndComposition)
{ {
_colorOpaqueOnly = RenderTexture.GetTemporary(_renderSize.x, _renderSize.y, 0, GetDefaultFormat());
var scaledRenderSize = GetScaledRenderSize();
_colorOpaqueOnly = RenderTexture.GetTemporary(scaledRenderSize.x, scaledRenderSize.y, 0, GetDefaultFormat());
_opaqueInputCommandBuffer.Blit(BuiltinRenderTextureType.CameraTarget, _colorOpaqueOnly); _opaqueInputCommandBuffer.Blit(BuiltinRenderTextureType.CameraTarget, _colorOpaqueOnly);
} }
@ -320,14 +322,16 @@ namespace FidelityFX
if (!enableAutoExposure && exposure != null) _dispatchDescription.Exposure = exposure; if (!enableAutoExposure && exposure != null) _dispatchDescription.Exposure = exposure;
if (reactiveMask != null) _dispatchDescription.Reactive = reactiveMask; if (reactiveMask != null) _dispatchDescription.Reactive = reactiveMask;
if (transparencyAndCompositionMask != null) _dispatchDescription.TransparencyAndComposition = transparencyAndCompositionMask; if (transparencyAndCompositionMask != null) _dispatchDescription.TransparencyAndComposition = transparencyAndCompositionMask;
var scaledRenderSize = GetScaledRenderSize();
_dispatchDescription.Output = null; _dispatchDescription.Output = null;
_dispatchDescription.PreExposure = preExposure; _dispatchDescription.PreExposure = preExposure;
_dispatchDescription.EnableSharpening = performSharpenPass; _dispatchDescription.EnableSharpening = performSharpenPass;
_dispatchDescription.Sharpness = sharpness; _dispatchDescription.Sharpness = sharpness;
_dispatchDescription.MotionVectorScale.x = -_renderSize.x;
_dispatchDescription.MotionVectorScale.y = -_renderSize.y;
_dispatchDescription.RenderSize = _renderSize;
_dispatchDescription.MotionVectorScale.x = -scaledRenderSize.x;
_dispatchDescription.MotionVectorScale.y = -scaledRenderSize.y;
_dispatchDescription.RenderSize = scaledRenderSize;
_dispatchDescription.FrameTimeDelta = Time.unscaledDeltaTime; _dispatchDescription.FrameTimeDelta = Time.unscaledDeltaTime;
_dispatchDescription.CameraNear = _renderCamera.nearClipPlane; _dispatchDescription.CameraNear = _renderCamera.nearClipPlane;
_dispatchDescription.CameraFar = _renderCamera.farClipPlane; _dispatchDescription.CameraFar = _renderCamera.farClipPlane;
@ -360,7 +364,7 @@ namespace FidelityFX
_genReactiveDescription.ColorOpaqueOnly = _colorOpaqueOnly; _genReactiveDescription.ColorOpaqueOnly = _colorOpaqueOnly;
_genReactiveDescription.ColorPreUpscale = null; _genReactiveDescription.ColorPreUpscale = null;
_genReactiveDescription.OutReactive = null; _genReactiveDescription.OutReactive = null;
_genReactiveDescription.RenderSize = _renderSize;
_genReactiveDescription.RenderSize = GetScaledRenderSize();
_genReactiveDescription.Scale = generateReactiveParameters.scale; _genReactiveDescription.Scale = generateReactiveParameters.scale;
_genReactiveDescription.CutoffThreshold = generateReactiveParameters.cutoffThreshold; _genReactiveDescription.CutoffThreshold = generateReactiveParameters.cutoffThreshold;
_genReactiveDescription.BinaryValue = generateReactiveParameters.binaryValue; _genReactiveDescription.BinaryValue = generateReactiveParameters.binaryValue;
@ -369,14 +373,16 @@ namespace FidelityFX
private void ApplyJitter() private void ApplyJitter()
{ {
var scaledRenderSize = GetScaledRenderSize();
// Perform custom jittering of the camera's projection matrix according to FSR2's recipe // Perform custom jittering of the camera's projection matrix according to FSR2's recipe
int jitterPhaseCount = Fsr2.GetJitterPhaseCount(_renderSize.x, _displaySize.x);
int jitterPhaseCount = Fsr2.GetJitterPhaseCount(scaledRenderSize.x, _displaySize.x);
Fsr2.GetJitterOffset(out float jitterX, out float jitterY, Time.frameCount, jitterPhaseCount); Fsr2.GetJitterOffset(out float jitterX, out float jitterY, Time.frameCount, jitterPhaseCount);
_dispatchDescription.JitterOffset = new Vector2(jitterX, jitterY); _dispatchDescription.JitterOffset = new Vector2(jitterX, jitterY);
jitterX = 2.0f * jitterX / _renderSize.x;
jitterY = 2.0f * jitterY / _renderSize.y;
jitterX = 2.0f * jitterX / scaledRenderSize.x;
jitterY = 2.0f * jitterY / scaledRenderSize.y;
var jitterTranslationMatrix = Matrix4x4.Translate(new Vector3(jitterX, jitterY, 0)); var jitterTranslationMatrix = Matrix4x4.Translate(new Vector3(jitterX, jitterY, 0));
_renderCamera.nonJitteredProjectionMatrix = _renderCamera.projectionMatrix; _renderCamera.nonJitteredProjectionMatrix = _renderCamera.projectionMatrix;
@ -401,7 +407,8 @@ namespace FidelityFX
if (autoGenerateReactiveMask) if (autoGenerateReactiveMask)
{ {
// The auto-reactive mask pass is executed separately from the main FSR2 passes // The auto-reactive mask pass is executed separately from the main FSR2 passes
_dispatchCommandBuffer.GetTemporaryRT(Fsr2ShaderIDs.UavAutoReactive, _renderSize.x, _renderSize.y, 0, default, GraphicsFormat.R8_UNorm, 1, true);
var scaledRenderSize = GetScaledRenderSize();
_dispatchCommandBuffer.GetTemporaryRT(Fsr2ShaderIDs.UavAutoReactive, scaledRenderSize.x, scaledRenderSize.y, 0, default, GraphicsFormat.R8_UNorm, 1, true);
_context.GenerateReactiveMask(_genReactiveDescription, _dispatchCommandBuffer); _context.GenerateReactiveMask(_genReactiveDescription, _dispatchCommandBuffer);
_dispatchDescription.Reactive = Fsr2ShaderIDs.UavAutoReactive; _dispatchDescription.Reactive = Fsr2ShaderIDs.UavAutoReactive;
} }
@ -456,5 +463,18 @@ namespace FidelityFX
return new Vector2Int(_renderCamera.pixelWidth, _renderCamera.pixelHeight); return new Vector2Int(_renderCamera.pixelWidth, _renderCamera.pixelHeight);
} }
private bool UsingDynamicResolution()
{
return _renderCamera.allowDynamicResolution || (_originalRenderTarget != null && _originalRenderTarget.useDynamicScale);
}
private Vector2Int GetScaledRenderSize()
{
if (UsingDynamicResolution())
return new Vector2Int(Mathf.CeilToInt(_renderSize.x * ScalableBufferManager.widthScaleFactor), Mathf.CeilToInt(_renderSize.y * ScalableBufferManager.heightScaleFactor));
return _renderSize;
}
} }
} }

2
ProjectSettings/ProjectSettings.asset

@ -144,7 +144,7 @@ PlayerSettings:
vrSettings: vrSettings:
enable360StereoCapture: 0 enable360StereoCapture: 0
isWsaHolographicRemotingEnabled: 0 isWsaHolographicRemotingEnabled: 0
enableFrameTimingStats: 0
enableFrameTimingStats: 1
enableOpenGLProfilerGPURecorders: 1 enableOpenGLProfilerGPURecorders: 1
useHDRDisplay: 0 useHDRDisplay: 0
D3DHDRBitDepth: 0 D3DHDRBitDepth: 0

Loading…
Cancel
Save