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.
195 lines
7.8 KiB
195 lines
7.8 KiB
#if ENABLE_UPSCALER_FRAMEWORK
|
|
using System;
|
|
using UnityEditor;
|
|
using UnityEngine.Rendering.RenderGraphModule;
|
|
|
|
namespace UnityEngine.Rendering
|
|
{
|
|
/// <summary>
|
|
/// Defines the essential contract for any upscaling technology.
|
|
/// </summary>
|
|
public interface IUpscaler : IRenderGraphRecorder
|
|
{
|
|
/// <summary>
|
|
/// Gets the display name of the upscaler (e.g., "FSR2").
|
|
/// </summary>
|
|
string GetName();
|
|
|
|
/// <summary>
|
|
/// Gets the options for this particular upscaler.
|
|
/// </summary>
|
|
UpscalerOptions GetOptions();
|
|
|
|
/// <summary>
|
|
/// Returns true if the upscaler uses temporal information from previous frames.
|
|
/// </summary>
|
|
bool IsTemporalUpscaler();
|
|
|
|
/// <summary>
|
|
/// Returns true if the upscaler supports XR rendering.
|
|
/// </summary>
|
|
bool IsSupportedXR();
|
|
|
|
|
|
/// <summary>
|
|
/// Calculates the pixel jitter for the current frame.
|
|
/// </summary>
|
|
void CalculateJitter(int frameIndex, out Vector2 jitter, out bool allowScaling);
|
|
|
|
/// <summary>
|
|
/// Determines the render resolution based on display resolution and optional internal state or options.
|
|
/// </summary>
|
|
void NegotiatePreUpscaleResolution(ref Vector2Int preUpscaleResolution, Vector2Int postUpscaleResolution);
|
|
}
|
|
|
|
public abstract class AbstractUpscaler : IUpscaler
|
|
{
|
|
public abstract string GetName();
|
|
public abstract bool IsTemporalUpscaler();
|
|
|
|
public virtual UpscalerOptions GetOptions() { return null; }
|
|
public virtual bool IsSupportedXR() { return false; }
|
|
public virtual void NegotiatePreUpscaleResolution(ref Vector2Int preUpscaleResolution, Vector2Int postUpscaleResolution) {}
|
|
public virtual void CalculateJitter(int frameIndex, out Vector2 jitter, out bool allowScaling)
|
|
{
|
|
jitter = -STP.Jit16(frameIndex);
|
|
allowScaling = false;
|
|
}
|
|
|
|
public virtual void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData) { }
|
|
}
|
|
|
|
public class UpscalingIO : ContextItem
|
|
{
|
|
// Upscalers like DLSS & FSR expect screen space values representing motion
|
|
// from _current frame to previous frame_. SRPs can have different configurations
|
|
// for motion vectors than the requirements, so we need to specify to the upscaler
|
|
// inputs on how to treat the values in the MV textures. They usually include a scaling
|
|
// factor which can be derived from the enums below.
|
|
public enum MotionVectorDomain
|
|
{
|
|
NDC, // [-1, 1] for X & Y
|
|
ScreenSpace, // [-W, W] for X, [-H, H] for Y
|
|
};
|
|
public enum MotionVectorDirection
|
|
{
|
|
PreviousFrameToCurrentFrame,
|
|
CurrentFrameToPreviousFrame
|
|
};
|
|
|
|
// -------------------------------------------------------
|
|
// TEXTURE I/O
|
|
// -------------------------------------------------------
|
|
public TextureHandle cameraColor;
|
|
public TextureHandle cameraDepth;
|
|
public TextureHandle motionVectorColor;
|
|
public TextureHandle exposureTexture;
|
|
public Vector2Int preUpscaleResolution;
|
|
public Vector2Int previousPreUpscaleResolution;
|
|
public Vector2Int postUpscaleResolution;
|
|
public bool enableTexArray;
|
|
public bool invertedDepth; // near plane: 1.0f, far plane: 0.0f
|
|
public bool flippedY; // upside down
|
|
public bool flippedX; // right to left
|
|
public bool hdrInput;
|
|
public Vector2Int motionVectorTextureSize;
|
|
public MotionVectorDomain motionVectorDomain;
|
|
public MotionVectorDirection motionVectorDirection;
|
|
public bool jitteredMotionVectors;
|
|
public Texture2D[] blueNoiseTextureSet;
|
|
|
|
// -------------------------------------------------------
|
|
// CAMERA
|
|
// -------------------------------------------------------
|
|
public int cameraInstanceID;
|
|
public float nearClipPlane;
|
|
public float farClipPlane;
|
|
public float fieldOfViewDegrees;
|
|
public int numActiveViews;
|
|
public int eyeIndex;
|
|
public Vector3[] worldSpaceCameraPositions;
|
|
public Vector3[] previousWorldSpaceCameraPositions;
|
|
public Vector3[] previousPreviousWorldSpaceCameraPositions;
|
|
public Matrix4x4[] projectionMatrices;
|
|
public Matrix4x4[] previousProjectionMatrices;
|
|
public Matrix4x4[] previousPreviousProjectionMatrices;
|
|
public Matrix4x4[] viewMatrices;
|
|
public Matrix4x4[] previousViewMatrices;
|
|
public Matrix4x4[] previousPreviousViewMatrices;
|
|
|
|
// Some implementations (HDRP) has the exposure value pre-applied
|
|
// to the lighting accumulation buffer as opposed to doing exposure
|
|
// in tonemapper. Some upscalers (DLSS/FSR) need to know about this
|
|
// exposure value used in the (previous) color input so that it can properly
|
|
// construct the current frame without ghosting artifacts while ignoring
|
|
// the exposure texture input listed above. This value is usually obtained
|
|
// by a CPU readback on the 1x1 exposure texture.
|
|
public float preExposureValue;
|
|
|
|
// Some upscalers can't support HDR color gamuts.
|
|
// Therefore, use HDRDisplayInformation to temporarily convert to SDR.
|
|
public HDROutputUtils.HDRDisplayInformation hdrDisplayInformation;
|
|
|
|
// -------------------------------------------------------
|
|
// TIME
|
|
// -------------------------------------------------------
|
|
public bool resetHistory;
|
|
public int frameIndex;
|
|
public float deltaTime;
|
|
public float previousDeltaTime;
|
|
|
|
// -------------------------------------------------------
|
|
// MISC
|
|
// -------------------------------------------------------
|
|
public bool enableMotionScaling;
|
|
public bool enableHwDrs;
|
|
|
|
public override void Reset()
|
|
{
|
|
cameraColor = TextureHandle.nullHandle;
|
|
cameraDepth = TextureHandle.nullHandle;
|
|
motionVectorColor = TextureHandle.nullHandle;
|
|
exposureTexture = TextureHandle.nullHandle;
|
|
preUpscaleResolution = new();
|
|
previousPreUpscaleResolution = new();
|
|
postUpscaleResolution = new();
|
|
enableTexArray = false;
|
|
invertedDepth = false;
|
|
flippedX = false;
|
|
flippedY = false;
|
|
hdrInput = false;
|
|
motionVectorTextureSize = new();
|
|
motionVectorDomain = MotionVectorDomain.NDC;
|
|
motionVectorDirection = MotionVectorDirection.PreviousFrameToCurrentFrame;
|
|
jitteredMotionVectors = false;
|
|
blueNoiseTextureSet = null;
|
|
|
|
cameraInstanceID = -1;
|
|
nearClipPlane = 0f;
|
|
farClipPlane = 0f;
|
|
fieldOfViewDegrees = 0f;
|
|
numActiveViews = 0;
|
|
eyeIndex = 0;
|
|
worldSpaceCameraPositions = Array.Empty<Vector3>();
|
|
previousWorldSpaceCameraPositions = Array.Empty<Vector3>();
|
|
previousPreviousWorldSpaceCameraPositions = Array.Empty<Vector3>();
|
|
projectionMatrices = Array.Empty<Matrix4x4>();
|
|
previousProjectionMatrices = Array.Empty<Matrix4x4>();
|
|
previousPreviousProjectionMatrices = Array.Empty<Matrix4x4>();
|
|
viewMatrices = Array.Empty<Matrix4x4>();
|
|
previousViewMatrices = Array.Empty<Matrix4x4>();
|
|
previousPreviousViewMatrices = Array.Empty<Matrix4x4>();
|
|
preExposureValue = 1.0f;
|
|
hdrDisplayInformation = new HDROutputUtils.HDRDisplayInformation();
|
|
|
|
resetHistory = true;
|
|
frameIndex = 0;
|
|
deltaTime = 0f;
|
|
previousDeltaTime = 0f;
|
|
|
|
enableMotionScaling = false;
|
|
enableHwDrs = false;
|
|
}
|
|
}
|
|
}
|
|
#endif
|