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.
 
 
 
 

164 lines
6.7 KiB

#if ENABLE_UPSCALER_FRAMEWORK
using UnityEngine;
using UnityEngine.Experimental.Rendering;
using UnityEngine.Rendering;
using UnityEngine.Rendering.RenderGraphModule;
#if UNITY_EDITOR
using UnityEditor;
#endif
#if UNITY_EDITOR
[InitializeOnLoad]
#endif
static class RegisterSTP
{
static RegisterSTP() => UpscalerRegistry.Register<STPIUpscaler, STPOptions>(STPIUpscaler.UPSCALER_NAME);
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
static void InitRuntime() => UpscalerRegistry.Register<STPIUpscaler, STPOptions>(STPIUpscaler.UPSCALER_NAME);
}
public class STPIUpscaler : AbstractUpscaler
{
public static readonly string UPSCALER_NAME = "STP (IUpscaler)";
STPOptions options; // contains injection point (for HDRP at this time)
private const string _UpscaledColorTargetName = "_UpscaledCameraColor";
private STP.HistoryContext[] histories; // One history per eye
public STPIUpscaler(STPOptions optionsIn)
{
options = optionsIn;
histories = new STP.HistoryContext[2];
for (int i = 0; i < histories.Length; i++)
{
histories[i] = new STP.HistoryContext();
}
}
public override UpscalerOptions GetOptions()
{
return options;
}
public override string GetName()
{
return UPSCALER_NAME;
}
public override bool IsTemporalUpscaler() { return true; }
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
{
UpscalingIO io = frameData.Get<UpscalingIO>();
// Create an output texture
TextureHandle outputColor;
{
TextureDesc inputDesc = io.cameraColor.GetDescriptor(renderGraph);
TextureDesc outputDesc = inputDesc;
outputDesc.width = io.postUpscaleResolution.x;
outputDesc.height = io.postUpscaleResolution.y;
// Avoid enabling sRGB because STP works with compute shaders which can't output sRGB automatically.
outputDesc.format = GraphicsFormatUtility.GetLinearFormat(inputDesc.format);
outputDesc.msaaSamples = MSAASamples.None;
outputDesc.useMipMap = false;
outputDesc.autoGenerateMips = false;
outputDesc.useDynamicScale = false;
outputDesc.anisoLevel = 0;
outputDesc.discardBuffer = false;
// STP uses compute shaders so all render textures must enable random writes
outputDesc.enableRandomWrite = true;
outputDesc.name = _UpscaledColorTargetName;
outputDesc.clearBuffer = false;
outputDesc.filterMode = FilterMode.Bilinear;
outputColor = renderGraph.CreateTexture(outputDesc);
}
// Populate the STP config
STP.Config config = new();
{
// TODO (Apoorva): Set this using UpscalingInputs when we add HDRP support
config.enableTexArray = io.enableTexArray;
config.enableMotionScaling = io.enableMotionScaling;
config.noiseTexture = io.blueNoiseTextureSet[io.frameIndex & (io.blueNoiseTextureSet.Length - 1)];
config.inputColor = io.cameraColor;
config.inputDepth = io.cameraDepth;
config.inputMotion = io.motionVectorColor;
config.currentImageSize = io.preUpscaleResolution;
config.priorImageSize = io.previousPreUpscaleResolution;
config.outputImageSize = io.postUpscaleResolution;
config.deltaTime = io.deltaTime;
config.lastDeltaTime = io.previousDeltaTime;
config.frameIndex = io.frameIndex;
config.nearPlane = io.nearClipPlane;
config.farPlane = io.farClipPlane;
// TODO (Apoorva): Support stencil masking. URP doesn't support this, HDRP does. We should add support for
// both.
config.inputStencil = TextureHandle.nullHandle;
config.stencilMask = 0;
// TODO (Apoorva): Add support for debug views.
config.debugView = TextureHandle.nullHandle;
config.debugViewIndex = 0;
config.destination = outputColor;
Debug.Assert(io.eyeIndex < histories.Length);
bool hasValidHistory;
{
STP.HistoryUpdateInfo info;
info.preUpscaleSize = io.preUpscaleResolution;
info.postUpscaleSize = io.postUpscaleResolution;
info.useHwDrs = io.enableHwDrs;
info.useTexArray = io.enableTexArray;
hasValidHistory = histories[io.eyeIndex].Update(ref info);
}
config.historyContext = histories[io.eyeIndex];
config.enableHwDrs = io.enableHwDrs;
config.hasValidHistory = !io.resetHistory && hasValidHistory;
config.numActiveViews = io.numActiveViews;
config.perViewConfigs = STP.perViewConfigs;
Debug.Assert(io.numActiveViews <= STP.perViewConfigs.Length);
for (int viewIndex = 0; viewIndex < io.numActiveViews; ++viewIndex)
{
int targetIndex = viewIndex + io.eyeIndex;
STP.PerViewConfig perViewConfig;
// STP requires non-jittered versions of the current, previous, and "previous previous" projection
// matrix.
perViewConfig.currentProj = io.projectionMatrices[targetIndex];
perViewConfig.lastProj = io.previousProjectionMatrices[targetIndex];
perViewConfig.lastLastProj = io.previousPreviousProjectionMatrices[targetIndex];
perViewConfig.currentView = io.viewMatrices[targetIndex];
perViewConfig.lastView = io.previousViewMatrices[targetIndex];
perViewConfig.lastLastView = io.previousPreviousViewMatrices[targetIndex];
// NOTE: STP assumes the view matrices also contain the world space camera position so we inject the
// camera position directly here.
Vector3 currentPosition = io.worldSpaceCameraPositions[viewIndex];
Vector3 lastPosition = io.previousWorldSpaceCameraPositions[viewIndex];
Vector3 lastLastPosition = io.previousPreviousWorldSpaceCameraPositions[viewIndex];
perViewConfig.currentView.SetColumn(3, new Vector4(-currentPosition.x, -currentPosition.y, -currentPosition.z, 1.0f));
perViewConfig.lastView.SetColumn(3, new Vector4(-lastPosition.x, -lastPosition.y, -lastPosition.z, 1.0f));
perViewConfig.lastLastView.SetColumn(3, new Vector4(-lastLastPosition.x, -lastLastPosition.y, -lastLastPosition.z, 1.0f));
STP.perViewConfigs[viewIndex] = perViewConfig;
}
}
STP.Execute(renderGraph, ref config);
io.cameraColor = outputColor;
}
}
#endif