|
|
|
@ -60,6 +60,12 @@ namespace FidelityFX |
|
|
|
|
|
|
|
private void OnEnable() |
|
|
|
{ |
|
|
|
// Set up the original camera to output all of the required FSR2 input resources at the desired resolution
|
|
|
|
_renderCamera = GetComponent<Camera>(); |
|
|
|
_originalDepthTextureMode = _renderCamera.depthTextureMode; |
|
|
|
_renderCamera.depthTextureMode = _originalDepthTextureMode | DepthTextureMode.Depth | DepthTextureMode.MotionVectors; |
|
|
|
|
|
|
|
// Initialize FSR2 context
|
|
|
|
Fsr2.InitializationFlags flags = 0; |
|
|
|
if (enableFP16) |
|
|
|
flags |= Fsr2.InitializationFlags.EnableFP16Usage; |
|
|
|
@ -68,16 +74,11 @@ namespace FidelityFX |
|
|
|
flags |= Fsr2.InitializationFlags.EnableDebugChecking; |
|
|
|
#endif
|
|
|
|
|
|
|
|
_displaySize = new Vector2Int(Screen.width, Screen.height); |
|
|
|
_displaySize = new Vector2Int(_renderCamera.pixelWidth, _renderCamera.pixelHeight); |
|
|
|
Fsr2.GetRenderResolutionFromQualityMode(out var renderWidth, out var renderHeight, _displaySize.x, _displaySize.y, qualityMode); |
|
|
|
_renderSize = new Vector2Int(renderWidth, renderHeight); |
|
|
|
_context = Fsr2.CreateContext(_displaySize, _renderSize, flags); |
|
|
|
|
|
|
|
// Set up the original camera to output all of the required FSR2 input resources at the desired resolution
|
|
|
|
_renderCamera = GetComponent<Camera>(); |
|
|
|
_originalDepthTextureMode = _renderCamera.depthTextureMode; |
|
|
|
_renderCamera.depthTextureMode = _originalDepthTextureMode | DepthTextureMode.Depth | DepthTextureMode.MotionVectors; |
|
|
|
|
|
|
|
_dispatchCommandBuffer = new CommandBuffer { name = "FSR2 Dispatch" }; |
|
|
|
|
|
|
|
// Create command buffers to bind the camera's output at the right moments in the render loop
|
|
|
|
@ -141,7 +142,7 @@ namespace FidelityFX |
|
|
|
|
|
|
|
private void Update() |
|
|
|
{ |
|
|
|
if (Screen.width != _prevDisplaySize.x || Screen.height != _prevDisplaySize.y || qualityMode != _prevQualityMode) |
|
|
|
if (_renderCamera.pixelWidth != _prevDisplaySize.x || _renderCamera.pixelHeight != _prevDisplaySize.y || qualityMode != _prevQualityMode) |
|
|
|
{ |
|
|
|
// Force all resources to be destroyed and recreated with the new settings
|
|
|
|
OnDisable(); |
|
|
|
@ -168,7 +169,7 @@ namespace FidelityFX |
|
|
|
{ |
|
|
|
// Render to a smaller portion of the screen by manipulating the camera's viewport rect
|
|
|
|
_originalRect = _renderCamera.rect; |
|
|
|
_renderCamera.aspect = (Screen.width * _originalRect.width) / (Screen.height * _originalRect.height); |
|
|
|
_renderCamera.aspect = (_renderCamera.pixelWidth * _originalRect.width) / (_renderCamera.pixelHeight * _originalRect.height); |
|
|
|
_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
|
|
|
|
@ -266,7 +267,7 @@ namespace FidelityFX |
|
|
|
else |
|
|
|
{ |
|
|
|
// We are rendering to the backbuffer, so we need a temporary render texture for FSR2 to output to
|
|
|
|
_dispatchCommandBuffer.GetTemporaryRT(Fsr2Pipeline.UavUpscaledOutput, Screen.width, Screen.height, 0, default, GraphicsFormat.R16G16B16A16_SFloat, 1, true); |
|
|
|
_dispatchCommandBuffer.GetTemporaryRT(Fsr2Pipeline.UavUpscaledOutput, _displaySize.x, _displaySize.y, 0, default, GraphicsFormat.R16G16B16A16_SFloat, 1, true); |
|
|
|
} |
|
|
|
|
|
|
|
_context.Dispatch(_dispatchDescription, _dispatchCommandBuffer); |
|
|
|
|