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.
130 lines
7.2 KiB
130 lines
7.2 KiB
using System;
|
|
using UnityEngine.Assertions;
|
|
using UnityEngine.Experimental.Rendering;
|
|
using UnityEngine.Rendering.RenderGraphModule;
|
|
|
|
namespace UnityEngine.Rendering.HighDefinition
|
|
{
|
|
public partial class HDRenderPipeline
|
|
{
|
|
void PopulateStpConfig(HDCamera hdCamera, TextureHandle inputColor, TextureHandle inputDepth, TextureHandle inputMotion, TextureHandle inputStencil, int debugViewIndex, TextureHandle debugView, TextureHandle destination, out STP.Config config)
|
|
{
|
|
hdCamera.RequestStpHistory(out var useHwDrs, out var hasValidHistory, out var history);
|
|
|
|
config.historyContext = history;
|
|
|
|
config.enableHwDrs = useHwDrs;
|
|
config.enableTexArray = TextureXR.useTexArray;
|
|
|
|
// The motion scaling feature is only active outside of test environments.
|
|
// If we allowed it to run during automated graphics tests, the results of each test run would be dependent on system performance.
|
|
#if HDRP_DEBUG_STATIC_POSTFX
|
|
config.enableMotionScaling = false;
|
|
#else
|
|
config.enableMotionScaling = true;
|
|
#endif
|
|
|
|
Assert.IsTrue(Mathf.IsPowerOfTwo(m_BlueNoise.textures16L.Length));
|
|
config.noiseTexture = m_BlueNoise.textures16L[hdCamera.taaFrameIndex & (m_BlueNoise.textures16L.Length - 1)];
|
|
|
|
config.inputColor = inputColor;
|
|
config.inputDepth = inputDepth;
|
|
config.inputMotion = inputMotion;
|
|
config.inputStencil = inputStencil;
|
|
|
|
config.debugView = debugView;
|
|
|
|
config.destination = destination;
|
|
|
|
// Ensure that the shader knows when it has valid history data
|
|
// We can have invalid history data if the camera post processing history is reset manually due to a camera cut or because
|
|
// this is the first frame and we haven't actually generated history data yet.
|
|
hasValidHistory &= !hdCamera.resetPostProcessingHistory;
|
|
|
|
config.nearPlane = hdCamera.projectionParams.y;
|
|
config.farPlane = hdCamera.projectionParams.z;
|
|
config.frameIndex = hdCamera.taaFrameIndex;
|
|
config.hasValidHistory = hasValidHistory;
|
|
config.stencilMask = (int)StencilUsage.ExcludeFromTUAndAA;
|
|
config.debugViewIndex = debugViewIndex;
|
|
|
|
config.deltaTime = hdCamera.currentRenderDeltaTime;
|
|
config.lastDeltaTime = hdCamera.lastRenderDeltaTime;
|
|
|
|
config.currentImageSize = hdCamera.historyRTHandleProperties.currentViewportSize;
|
|
config.priorImageSize = hdCamera.historyRTHandleProperties.previousViewportSize;
|
|
config.outputImageSize = new Vector2Int((int)hdCamera.finalViewport.width, (int)hdCamera.finalViewport.height);
|
|
|
|
// The number of active views may vary over time, but it must never be more than we expected during initialization.
|
|
int numActiveViews = hdCamera.m_XRViewConstants.Length;
|
|
Debug.Assert(numActiveViews <= STP.perViewConfigs.Length);
|
|
|
|
for (int viewIndex = 0; viewIndex < numActiveViews; ++viewIndex)
|
|
{
|
|
STP.PerViewConfig perViewConfig;
|
|
|
|
// STP requires non-jittered versions of the current, previous, and "previous previous" projection matrix.
|
|
// NOTE: The "prevProjMatrix" and "prevPrevProjMatrix" values are always unjittered because they are sourced from the nonJitteredProjMatrix value.
|
|
perViewConfig.currentProj = hdCamera.m_XRViewConstants[viewIndex].nonJitteredProjMatrix;
|
|
perViewConfig.lastProj = hdCamera.m_XRViewConstants[viewIndex].prevProjMatrix;
|
|
perViewConfig.lastLastProj = hdCamera.m_XRViewConstants[viewIndex].prevPrevProjMatrix;
|
|
|
|
perViewConfig.currentView = hdCamera.m_XRViewConstants[viewIndex].viewMatrix;
|
|
perViewConfig.lastView = hdCamera.m_XRViewConstants[viewIndex].prevViewMatrix;
|
|
perViewConfig.lastLastView = hdCamera.m_XRViewConstants[viewIndex].prevPrevViewMatrix;
|
|
|
|
// NOTE: STP assumes the view matrices also contain the camera position. However, HDRP may be configured to perform camera relative rendering which
|
|
// removes the camera translation from the view matrices. We inject the camera position directly into the view matrix here to make sure we don't
|
|
// run into issues when camera relative rendering is enabled.
|
|
//
|
|
// Also, the previous world space camera position variable is specified as a value relative to the current world space camera position.
|
|
// We must add both values together in order to produce the last camera position as an absolute world space value.
|
|
Vector3 currentPosition = hdCamera.m_XRViewConstants[viewIndex].worldSpaceCameraPos;
|
|
Vector3 lastPosition = hdCamera.m_XRViewConstants[viewIndex].prevWorldSpaceCameraPos + hdCamera.m_XRViewConstants[viewIndex].worldSpaceCameraPos;
|
|
Vector3 lastLastPosition = hdCamera.m_XRViewConstants[viewIndex].prevPrevWorldSpaceCameraPos + lastPosition;
|
|
|
|
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;
|
|
}
|
|
|
|
config.numActiveViews = numActiveViews;
|
|
config.perViewConfigs = STP.perViewConfigs;
|
|
}
|
|
|
|
TextureHandle DoStpPasses(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle inputColor, TextureHandle inputDepth, TextureHandle inputMotion, TextureHandle inputStencil)
|
|
{
|
|
bool debugEnabled = (m_CurrentDebugDisplaySettings.data.fullScreenDebugMode == FullScreenDebugMode.STP);
|
|
int debugViewIndex = debugDisplaySettings.data.stpDebugViewIndex;
|
|
|
|
TextureHandle destination = GetPostprocessUpsampledOutputHandle(hdCamera, renderGraph, "STP Output Color");
|
|
|
|
TextureHandle debugView = TextureHandle.nullHandle;
|
|
|
|
if (debugEnabled)
|
|
{
|
|
debugView = renderGraph.CreateTexture(new TextureDesc(m_AfterDynamicResUpscaleRes.x, m_AfterDynamicResUpscaleRes.y, false, true)
|
|
{
|
|
name = "STP Debug View",
|
|
colorFormat = GraphicsFormat.R8G8B8A8_UNorm,
|
|
clearBuffer = true,
|
|
enableRandomWrite = true
|
|
});
|
|
}
|
|
|
|
PopulateStpConfig(hdCamera, inputColor, inputDepth, inputMotion, inputStencil, debugViewIndex, debugView, destination, out var config);
|
|
STP.Execute(renderGraph, ref config);
|
|
|
|
if (debugEnabled)
|
|
{
|
|
// TODO: Investigate 2x2 pixel size issue in debug view
|
|
// Issue is still present regardless of fixed size or 1.0 scale debug texture create info
|
|
PushFullScreenDebugTexture(renderGraph, debugView, true, Vector2.one, rtFormat: GraphicsFormat.R8G8B8A8_UNorm);
|
|
}
|
|
|
|
return destination;
|
|
}
|
|
}
|
|
}
|