@ -6,27 +6,25 @@ using UnityEngine.Rendering;
[RequireComponent(typeof(Camera))]
public class SubsampleTest : MonoBehaviour // TODO: rename this to Fsr2Controller
{
[SerializeField]
private Fsr2 . QualityMode qualityMode ;
private Camera _renderCamera ;
private RenderTexture _originalRenderTarget ;
private GameObject _displayCameraObject ;
private Camera _displayCamera ;
[SerializeField]
private Fsr2 . QualityMode qualityMode ;
private Fsr2Controller _fsr2Controller ;
private float _renderScale ;
private Fsr2 . QualityMode _prevQualityMode ;
private Vector2Int _prevScreenSize ;
private CommandBuffer _opaqueOnlyCommandBuffer ;
private CommandBuffer _reactive CommandBuffer ;
private CommandBuffer _inputs CommandBuffer ;
private void OnEnable ( )
{
_renderScale = 1.0f / Fsr2 . GetUpscaleRatioFromQualityMode ( qualityMode ) ;
_renderCamera = GetComponent < Camera > ( ) ;
if ( _displayCameraObject = = null )
{
@ -50,36 +48,36 @@ public class SubsampleTest : MonoBehaviour // TODO: rename this to Fsr2Controll
}
_fsr2Controller . renderCamera = _renderCamera ;
_fsr2Controller . renderScale = _renderScale ;
_fsr2Controller . renderScale = 1.0f / Fsr2 . GetUpscaleRatioFromQualityMode ( qualityMode ) ;
_fsr2Controller . enabled = true ;
Fsr2 . GetRenderResolutionFromQualityMode ( out var renderWidth , out var renderHeight , Screen . width , Screen . height , qualityMode ) ;
// TODO: check if the camera doesn't already have a target texture
_originalRenderTarget = _renderCamera . targetTexture ; // TODO: if this isn't null, could maybe reuse this for the output texture?
_renderCamera . targetTexture = new RenderTexture (
renderWidth , renderHeight ,
2 4 , // Can we copy depth value from original camera?
RenderTextureFormat . ARGBHalf ) ; // Can we copy format from original camera? Or renderer quality settings?
_renderCamera . depthTextureMode | = DepthTextureMode . Depth | DepthTextureMode . MotionVectors ;
_originalRenderTarget ! = null ? _originalRenderTarget . depth : 3 2 ,
_originalRenderTarget ! = null ? _originalRenderTarget . format : RenderTextureFormat . ARGBHalf ) { name = "FSR2 Input Texture" } ;
_renderCamera . targetTexture . name = "FSR2 Input Texture" ;
_renderCamera . targetTexture . Create ( ) ;
_renderCamera . depthTextureMode | = DepthTextureMode . Depth | DepthTextureMode . MotionVectors ;
_opaqueOnlyCommandBuffer = new CommandBuffer { name = "FSR2 Opaque Input" } ;
// TODO: may need to copy the opaque-only render buffer to a temp RT here, in which case we'll need an additional CommandBuffer to release the temp RT again
_opaqueOnlyCommandBuffer . SetGlobalTexture ( Fsr2Pipeline . SrvOpaqueOnly , BuiltinRenderTextureType . CameraTarget , RenderTextureSubElement . Color ) ;
_renderCamera . AddCommandBuffer ( CameraEvent . BeforeImageEffectsOpaque , _opaqueOnlyCommandBuffer ) ;
_reactive CommandBuffer = new CommandBuffer { name = "FSR2 Inputs" } ;
_reactive CommandBuffer . SetGlobalTexture ( Fsr2Pipeline . SrvInputColor , BuiltinRenderTextureType . CameraTarget , RenderTextureSubElement . Color ) ;
_reactive CommandBuffer . SetGlobalTexture ( Fsr2Pipeline . SrvInputDepth , BuiltinRenderTextureType . CameraTarget , RenderTextureSubElement . Depth ) ;
_reactive CommandBuffer . SetGlobalTexture ( Fsr2Pipeline . SrvInputMotionVectors , BuiltinRenderTextureType . MotionVectors ) ;
_renderCamera . AddCommandBuffer ( CameraEvent . BeforeImageEffects , _reactive CommandBuffer ) ;
_inputs CommandBuffer = new CommandBuffer { name = "FSR2 Inputs" } ;
_inputs CommandBuffer . SetGlobalTexture ( Fsr2Pipeline . SrvInputColor , BuiltinRenderTextureType . CameraTarget , RenderTextureSubElement . Color ) ;
_inputs CommandBuffer . SetGlobalTexture ( Fsr2Pipeline . SrvInputDepth , BuiltinRenderTextureType . CameraTarget , RenderTextureSubElement . Depth ) ;
_inputs CommandBuffer . SetGlobalTexture ( Fsr2Pipeline . SrvInputMotionVectors , BuiltinRenderTextureType . MotionVectors ) ;
_renderCamera . AddCommandBuffer ( CameraEvent . BeforeImageEffects , _inputs CommandBuffer ) ;
// Adjust texture mipmap LOD bias by log2(renderResolution/displayResolution) - 1.0;
// May need to leave this to the game dev, as we don't know which textures do and don't belong to the 3D scene
float biasOffset = Fsr2 . GetMipmapBiasOffset ( _renderScale ) ;
float biasOffset = Fsr2 . GetMipmapBiasOffset ( renderWidth , Screen . width ) ;
Fsr2 . GlobalCallbacks . ApplyMipmapBias ( biasOffset ) ;
_prevScreenSize = new Vector2Int ( Screen . width , Screen . height ) ;
@ -88,19 +86,19 @@ public class SubsampleTest : MonoBehaviour // TODO: rename this to Fsr2Controll
private void OnDisable ( )
{
float biasOffset = Fsr2 . GetMipmapBiasOffset ( _renderScale ) ;
float biasOffset = Fsr2 . GetMipmapBiasOffset ( _renderCamera . targetTexture . width , _prevScreenSize . x ) ;
Fsr2 . GlobalCallbacks . ApplyMipmapBias ( - biasOffset ) ;
_renderCamera . RemoveCommandBuffer ( CameraEvent . BeforeImageEffectsOpaque , _opaqueOnlyCommandBuffer ) ;
_opaqueOnlyCommandBuffer . Release ( ) ;
_opaqueOnlyCommandBuffer = null ;
_renderCamera . RemoveCommandBuffer ( CameraEvent . BeforeImageEffects , _reactive CommandBuffer ) ;
_reactive CommandBuffer . Release ( ) ;
_reactive CommandBuffer = null ;
_renderCamera . RemoveCommandBuffer ( CameraEvent . BeforeImageEffects , _inputs CommandBuffer ) ;
_inputs CommandBuffer . Release ( ) ;
_inputs CommandBuffer = null ;
_renderCamera . targetTexture . Release ( ) ;
_renderCamera . targetTexture = null ;
_renderCamera . targetTexture = _originalRenderTarget ;
_fsr2Controller . enabled = false ;
_displayCamera . enabled = false ;