FSR2 tests in Unity based on built-in render pipeline
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

119 lines
3.2 KiB

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using FidelityFX;
using UnityEditor;
using UnityEngine;
using UnityEngine.Rendering;
/// <summary>
/// This class is responsible for hooking into various Unity events and translating them to the FSR2 subsystem.
/// This includes creation and destruction of the FSR2 context, as well as dispatching commands at the right time.
/// This class also exposes various FSR2 parameters to the Unity inspector.
/// </summary>
public class Fsr2Controller : MonoBehaviour
{
[SerializeField]
private bool performSharpenPass = true;
[SerializeField, Range(0, 1)]
private float sharpness = 0.8f;
[HideInInspector]
public Camera gameCamera;
[HideInInspector]
public Camera outputCamera;
[HideInInspector]
public float renderScale;
private Fsr2Context _context;
private RenderTexture _upscaleRT;
private RenderTexture _rcasOutput;
private Texture2D _exposure;
private Material _testMaterial;
private Material TestMaterial
{
get
{
if (_testMaterial == null)
{
var testShader = Fsr2.Callbacks.LoadShader("FSR2/FSRTest");
_testMaterial = new Material(testShader);
}
return _testMaterial;
}
}
private void OnEnable()
{
RenderPipelineManager.endContextRendering += OnEndContextRendering;
_context = Fsr2.CreateContext();
_upscaleRT = new RenderTexture(Screen.width, Screen.height, 24, RenderTextureFormat.ARGBHalf);
_upscaleRT.Create();
_rcasOutput = new RenderTexture(Screen.width, Screen.height, 24, RenderTextureFormat.ARGBHalf);
_rcasOutput.enableRandomWrite = true;
_rcasOutput.Create();
_exposure = new Texture2D(1, 1);
_exposure.name = "FSR2 Exposure";
_exposure.SetPixel(0, 0, Color.white);
_exposure.Apply();
}
private void OnDisable()
{
if (_exposure != null)
{
Destroy(_exposure);
_exposure = null;
}
if (_rcasOutput != null)
{
_rcasOutput.Release();
_rcasOutput = null;
}
if (_upscaleRT != null)
{
_upscaleRT.Release();
_upscaleRT = null;
}
if (_context != null)
{
_context.Destroy();
_context = null;
}
RenderPipelineManager.endContextRendering -= OnEndContextRendering;
}
// For scriptable rendering pipeline
private void OnEndContextRendering(ScriptableRenderContext context, List<Camera> cameras)
{
Debug.Log($"OnEndContentRendering, cameras = {string.Join(", ", cameras.Select(c => c.name))}");
}
// For legacy built-in render pipeline
private void OnRenderImage(RenderTexture src, RenderTexture dest)
{
// Do a dumb upscale first
Graphics.Blit(gameCamera.targetTexture, _upscaleRT, TestMaterial);
_context.Dispatch(_upscaleRT, _rcasOutput, _exposure, performSharpenPass, sharpness);
// Output sharpened image to screen
Graphics.Blit(_rcasOutput, dest);
}
}