From d98cffea35997ba8ef5bd86dc90f31010b84e1eb Mon Sep 17 00:00:00 2001 From: FrancescoC-unity <43168857+FrancescoC-unity@users.noreply.github.com> Date: Sun, 25 Oct 2020 00:00:42 +0200 Subject: [PATCH] Skip passes when everything is disabled in frame settings (#2279) * Fix rendergraph default resources init * Make sure passes are skipped when opaque and transparents objects are off * Skip pre render sky if backplate is disabled (? can we do this?) * More generic name for the pre render sky (in case is not tied to backplate in custom code) * Skip clear stencil * Use sanitization instead of checking opaque explicitly * Some merging of settings * missing transparent --- .../Runtime/RenderGraph/RenderGraph.cs | 3 +- .../RenderGraphDefaultResources.cs | 31 ++++++------------ .../Shadow/HDShadowManager.RenderGraph.cs | 3 +- .../HDRenderPipeline.Prepass.cs | 32 ++++++++++++++++--- .../HDRenderPipeline.RenderGraph.cs | 29 +++++++++++++++-- .../RenderPipeline/Settings/FrameSettings.cs | 9 ++++-- .../Runtime/Sky/HDRISky/HDRISkyRenderer.cs | 6 ++++ .../Runtime/Sky/SkyManager.cs | 6 ++++ .../Runtime/Sky/SkyRenderer.cs | 8 +++++ 9 files changed, 93 insertions(+), 34 deletions(-) diff --git a/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs b/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs index cab8e7b1d68..9cf6f140e26 100644 --- a/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs +++ b/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraph.cs @@ -233,7 +233,6 @@ public RenderGraphDefaultResources defaultResources { get { - m_DefaultResources.InitializeForRendering(this); return m_DefaultResources; } } @@ -435,6 +434,7 @@ public void Begin(in RenderGraphParameters parameters) m_Logger.Initialize(); m_Resources.BeginRender(parameters.currentFrameIndex, m_ExecutionCount); + m_DefaultResources.InitializeForRendering(this); m_RenderGraphContext.cmd = parameters.commandBuffer; m_RenderGraphContext.renderContext = parameters.scriptableRenderContext; @@ -555,7 +555,6 @@ internal void ClearCompiledGraph() { ClearRenderPasses(); m_Resources.Clear(m_ExecutionExceptionWasRaised); - m_DefaultResources.Clear(); m_RendererLists.Clear(); for (int i = 0; i < (int)RenderGraphResourceType.Count; ++i) m_CompiledResourcesInfos[i].Clear(); diff --git a/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphDefaultResources.cs b/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphDefaultResources.cs index 367fdfcd0dc..58b9809c074 100644 --- a/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphDefaultResources.cs +++ b/com.unity.render-pipelines.core/Runtime/RenderGraph/RenderGraphDefaultResources.cs @@ -46,29 +46,18 @@ internal void Cleanup() internal void InitializeForRendering(RenderGraph renderGraph) { - if (!m_IsValid) - { - blackTexture = renderGraph.ImportTexture(m_BlackTexture2D); - whiteTexture = renderGraph.ImportTexture(m_WhiteTexture2D); - - clearTextureXR = renderGraph.ImportTexture(TextureXR.GetClearTexture()); - magentaTextureXR = renderGraph.ImportTexture(TextureXR.GetMagentaTexture()); - blackTextureXR = renderGraph.ImportTexture(TextureXR.GetBlackTexture()); - blackTextureArrayXR = renderGraph.ImportTexture(TextureXR.GetBlackTextureArray()); - blackUIntTextureXR = renderGraph.ImportTexture(TextureXR.GetBlackUIntTexture()); - blackTexture3DXR = renderGraph.ImportTexture(TextureXR.GetBlackTexture3D()); - whiteTextureXR = renderGraph.ImportTexture(TextureXR.GetWhiteTexture()); - - m_IsValid = true; - } + blackTexture = renderGraph.ImportTexture(m_BlackTexture2D); + whiteTexture = renderGraph.ImportTexture(m_WhiteTexture2D); + + clearTextureXR = renderGraph.ImportTexture(TextureXR.GetClearTexture()); + magentaTextureXR = renderGraph.ImportTexture(TextureXR.GetMagentaTexture()); + blackTextureXR = renderGraph.ImportTexture(TextureXR.GetBlackTexture()); + blackTextureArrayXR = renderGraph.ImportTexture(TextureXR.GetBlackTextureArray()); + blackUIntTextureXR = renderGraph.ImportTexture(TextureXR.GetBlackUIntTexture()); + blackTexture3DXR = renderGraph.ImportTexture(TextureXR.GetBlackTexture3D()); + whiteTextureXR = renderGraph.ImportTexture(TextureXR.GetWhiteTexture()); } - // Imported resources are cleared everytime the Render Graph is executed, so we need to know if that happens - // so that we can re-import all default resources if needed. - internal void Clear() - { - m_IsValid = false; - } } } diff --git a/com.unity.render-pipelines.high-definition/Runtime/Lighting/Shadow/HDShadowManager.RenderGraph.cs b/com.unity.render-pipelines.high-definition/Runtime/Lighting/Shadow/HDShadowManager.RenderGraph.cs index 6d56390ab82..6dd3d6587c8 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Lighting/Shadow/HDShadowManager.RenderGraph.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Lighting/Shadow/HDShadowManager.RenderGraph.cs @@ -36,7 +36,8 @@ internal static ShadowResult ReadShadowResult(in ShadowResult shadowResult, Rend internal void RenderShadows(RenderGraph renderGraph, in ShaderVariablesGlobal globalCB, HDCamera hdCamera, CullingResults cullResults, ref ShadowResult result) { // Avoid to do any commands if there is no shadow to draw - if (m_ShadowRequestCount != 0) + if (m_ShadowRequestCount != 0 && + (hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects) || hdCamera.frameSettings.IsEnabled(FrameSettingsField.TransparentObjects))) { cachedShadowManager.punctualShadowAtlas.RenderShadows(renderGraph, cullResults, globalCB, hdCamera.frameSettings, "Cached Punctual Lights Shadows rendering", ref result.cachedPunctualShadowResult); cachedShadowManager.punctualShadowAtlas.AddBlitRequestsForUpdatedShadows(m_Atlas); diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.Prepass.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.Prepass.cs index 6909ed7b786..b6d4f26dd3b 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.Prepass.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.Prepass.cs @@ -316,6 +316,14 @@ bool RenderDepthPrepass(RenderGraph renderGraph, CullingResults cull, HDCamera h bool msaa = hdCamera.frameSettings.IsEnabled(FrameSettingsField.MSAA); bool decalLayersEnabled = hdCamera.frameSettings.IsEnabled(FrameSettingsField.DecalLayers); + if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects)) + { + decalBuffer = renderGraph.defaultResources.blackTextureXR; + output.depthAsColor = renderGraph.defaultResources.blackTextureXR; + output.normalBuffer = CreateNormalBuffer(renderGraph, msaa); + return false; + } + using (var builder = renderGraph.AddRenderPass(depthPrepassParameters.passName, out var passData, ProfilingSampler.Get(depthPrepassParameters.profilingId))) { passData.frameSettings = hdCamera.frameSettings; @@ -398,7 +406,8 @@ class ObjectMotionVectorsPassData void RenderObjectsMotionVectors(RenderGraph renderGraph, CullingResults cull, HDCamera hdCamera, TextureHandle decalBuffer, in PrepassOutput output) { - if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.ObjectMotionVectors)) + if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.ObjectMotionVectors) || + !hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects)) return; using (var builder = renderGraph.AddRenderPass("Objects Motion Vectors Rendering", out var passData, ProfilingSampler.Get(HDProfileId.ObjectsMotionVector))) @@ -533,7 +542,8 @@ static void BindProbeVolumeGlobalData(in FrameSettings frameSettings, GBufferPas // during Gbuffer pass. This is handled in the shader and the depth test (equal and no depth write) is done here. void RenderGBuffer(RenderGraph renderGraph, TextureHandle sssBuffer, TextureHandle vtFeedbackBuffer, ref PrepassOutput prepassOutput, in BuildGPULightListOutput probeVolumeLightList, CullingResults cull, HDCamera hdCamera) { - if (hdCamera.frameSettings.litShaderMode != LitShaderMode.Deferred) + if (hdCamera.frameSettings.litShaderMode != LitShaderMode.Deferred || + !hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects)) { prepassOutput.gbuffer.gBufferCount = 0; return; @@ -651,6 +661,12 @@ class CopyDepthPassData void CopyDepthBufferIfNeeded(RenderGraph renderGraph, HDCamera hdCamera, ref PrepassOutput output) { + if(!hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects)) + { + output.depthPyramidTexture = renderGraph.defaultResources.blackTextureXR; + return; + } + if (!m_IsDepthBufferCopyValid) { using (var builder = renderGraph.AddRenderPass("Copy depth buffer", out var passData, ProfilingSampler.Get(HDProfileId.CopyDepthBuffer))) @@ -783,7 +799,8 @@ void RenderDBuffer(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle dec { bool use4RTs = m_Asset.currentPlatformRenderPipelineSettings.decalSettings.perChannelMask; - if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.Decals)) + if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.Decals) || + !hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects)) { // Return all black textures for default values. var blackTexture = renderGraph.defaultResources.blackTextureXR; @@ -854,7 +871,8 @@ void DecalNormalPatch(RenderGraph renderGraph, HDCamera hdCamera, ref PrepassOut } if (hdCamera.frameSettings.IsEnabled(FrameSettingsField.Decals) && - !hdCamera.frameSettings.IsEnabled(FrameSettingsField.MSAA)) // MSAA not supported + !hdCamera.frameSettings.IsEnabled(FrameSettingsField.MSAA) && + hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects)) // MSAA not supported { using (var builder = renderGraph.AddRenderPass("DBuffer Normal (forward)", out var passData, ProfilingSampler.Get(HDProfileId.DBufferNormal))) { @@ -949,6 +967,12 @@ class GenerateDepthPyramidPassData void GenerateDepthPyramid(RenderGraph renderGraph, HDCamera hdCamera, bool mip0AlreadyComputed, ref PrepassOutput output) { + if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects)) + { + output.depthPyramidTexture = renderGraph.defaultResources.blackTextureXR; + return; + } + // If the depth buffer hasn't been already copied by the decal or low res depth buffer pass, then we do the copy here. CopyDepthBufferIfNeeded(renderGraph, hdCamera, ref output); diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs index 7c2965549db..34ce237e739 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs @@ -174,8 +174,11 @@ void ExecuteWithRenderGraph( RenderRequest renderRequest, m_PostProcessSystem.DoUserAfterOpaqueAndSky(m_RenderGraph, hdCamera, colorBuffer, prepassOutput.resolvedDepthBuffer, prepassOutput.resolvedNormalBuffer); - // No need for old stencil values here since from transparent on different features are tagged - ClearStencilBuffer(m_RenderGraph, colorBuffer, prepassOutput.depthBuffer); + if (hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects)) // If we don't have opaque objects there is no need to clear. + { + // No need for old stencil values here since from transparent on different features are tagged + ClearStencilBuffer(m_RenderGraph, colorBuffer, prepassOutput.depthBuffer); + } colorBuffer = RenderTransparency(m_RenderGraph, hdCamera, colorBuffer, vtFeedbackBuffer, currentColorPyramid, volumetricLighting, rayCountTexture, m_SkyManager.GetSkyReflection(hdCamera), gpuLightListOutput, ref prepassOutput, shadowResult, cullingResults, customPassCullingResults, aovRequest, aovBuffers); @@ -512,6 +515,9 @@ void RenderForwardOpaque( RenderGraph renderGraph, { bool debugDisplay = m_CurrentDebugDisplaySettings.IsDebugDisplayEnabled(); + if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects)) + return; + using (var builder = renderGraph.AddRenderPass( debugDisplay ? "Forward Opaque Debug" : "Forward Opaque", out var passData, debugDisplay ? ProfilingSampler.Get(HDProfileId.ForwardOpaqueDebug) : ProfilingSampler.Get(HDProfileId.ForwardOpaque))) @@ -573,6 +579,9 @@ void RenderForwardTransparent( RenderGraph renderGraph, CullingResults cullResults, bool preRefractionPass) { + if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.TransparentObjects)) + return; + // If rough refraction are turned off, we render all transparents in the Transparent pass and we skip the PreRefraction one. if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.Refraction) && preRefractionPass) return; @@ -927,6 +936,12 @@ void RenderForwardEmissive( RenderGraph renderGraph, TextureHandle depthStencilBuffer, CullingResults cullingResults) { + if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.TransparentObjects) && + !hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects)) + { + return; + } + using (var builder = renderGraph.AddRenderPass("ForwardEmissive", out var passData, ProfilingSampler.Get(HDProfileId.ForwardEmissive))) { builder.UseColorBuffer(colorBuffer, 0); @@ -953,6 +968,13 @@ void RenderForwardError(RenderGraph renderGraph, TextureHandle depthStencilBuffer, CullingResults cullResults) { + if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.TransparentObjects) && + !hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects)) + { + return; + } + + using (var builder = renderGraph.AddRenderPass("Forward Error", out var passData, ProfilingSampler.Get(HDProfileId.RenderForwardError))) { builder.UseColorBuffer(colorBuffer, 0); @@ -1058,7 +1080,8 @@ class PreRenderSkyPassData void PreRenderSky(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle colorBuffer, TextureHandle depthStencilBuffer, TextureHandle normalbuffer) { - if (m_CurrentDebugDisplaySettings.DebugHideSky(hdCamera)) + if (m_CurrentDebugDisplaySettings.DebugHideSky(hdCamera) || + !m_SkyManager.RequiresPreRenderSky(hdCamera)) { return; } diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Settings/FrameSettings.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Settings/FrameSettings.cs index 67c67dd793c..f6ca0e413ec 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Settings/FrameSettings.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Settings/FrameSettings.cs @@ -773,7 +773,7 @@ internal static void Sanitize(ref FrameSettings sanitizedFrameSettings, Camera c // Planar and real time cubemap doesn't need post process and render in FP16 sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.Postprocess] &= !reflection && !preview; - sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.TransparentPrepass] &= renderPipelineSettings.supportTransparentDepthPrepass && !preview; + sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.TransparentPrepass] &= renderPipelineSettings.supportTransparentDepthPrepass && !preview && sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.TransparentObjects]; bool motionVector = sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.MotionVectors] &= renderPipelineSettings.supportMotionVectors && !preview; @@ -783,12 +783,12 @@ internal static void Sanitize(ref FrameSettings sanitizedFrameSettings, Camera c sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.Decals] &= renderPipelineSettings.supportDecals && !preview; sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.DecalLayers] &= renderPipelineSettings.supportDecalLayers && sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.Decals]; - sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.TransparentPostpass] &= renderPipelineSettings.supportTransparentDepthPostpass && !preview; + sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.TransparentPostpass] &= renderPipelineSettings.supportTransparentDepthPostpass && !preview && sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.TransparentObjects]; bool distortion = sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.Distortion] &= renderPipelineSettings.supportDistortion && !msaa && !preview; sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.RoughDistortion] &= distortion && !msaa && !preview; - sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.LowResTransparent] &= renderPipelineSettings.lowresTransparentSettings.enabled; + sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.LowResTransparent] &= renderPipelineSettings.lowresTransparentSettings.enabled && sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.TransparentObjects]; bool async = sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.AsyncCompute] &= SystemInfo.supportsAsyncCompute; sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.LightListAsync] &= async; @@ -815,6 +815,9 @@ internal static void Sanitize(ref FrameSettings sanitizedFrameSettings, Camera c // but with the preview lights which are different from the ones in the scene and will change the result inducing flickering. sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.ReflectionProbe] &= !preview; sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.PlanarProbe] &= !preview; + + + sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.SubsurfaceScattering] &= sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.OpaqueObjects]; } /// Aggregation is default with override of the renderer then sanitized depending on supported features of hdrpasset. diff --git a/com.unity.render-pipelines.high-definition/Runtime/Sky/HDRISky/HDRISkyRenderer.cs b/com.unity.render-pipelines.high-definition/Runtime/Sky/HDRISky/HDRISkyRenderer.cs index 7d26e2bc9d3..e9e361db358 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Sky/HDRISky/HDRISkyRenderer.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Sky/HDRISky/HDRISkyRenderer.cs @@ -86,6 +86,12 @@ private Vector4 GetBackplateParameters2(HDRISky hdriSky) return new Vector4(Mathf.Cos(localPhi), Mathf.Sin(localPhi), hdriSky.plateTexOffset.value.x, hdriSky.plateTexOffset.value.y); } + public override bool RequiresPreRenderSky(BuiltinSkyParameters builtinParams) + { + var hdriSky = builtinParams.skySettings as HDRISky; + return hdriSky.enableBackplate.value; + } + public override void PreRenderSky(BuiltinSkyParameters builtinParams, bool renderForCubemap, bool renderSunDisk) { var hdriSky = builtinParams.skySettings as HDRISky; diff --git a/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyManager.cs b/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyManager.cs index aab0382a6ea..42c93cf1f3c 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyManager.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyManager.cs @@ -865,6 +865,12 @@ internal void UpdateBuiltinParameters(SkyUpdateContext skyContext, HDCamera hdCa m_BuiltinParameters.skySettings = skyContext.skySettings; } + public bool RequiresPreRenderSky(HDCamera hdCamera) + { + var skyContext = hdCamera.visualSky; + return skyContext.IsValid() && skyContext.skyRenderer.RequiresPreRenderSky(m_BuiltinParameters); + } + public void PreRenderSky(HDCamera hdCamera, Light sunLight, RTHandle colorBuffer, RTHandle normalBuffer, RTHandle depthBuffer, DebugDisplaySettings debugSettings, int frameIndex, CommandBuffer cmd) { var skyContext = hdCamera.visualSky; diff --git a/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyRenderer.cs b/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyRenderer.cs index af82963f3bc..26c5ad3da60 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyRenderer.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyRenderer.cs @@ -35,6 +35,14 @@ public abstract class SkyRenderer /// If the sky renderer supports the rendering of a sun disk, it must not render it if this is set to false. public virtual void PreRenderSky(BuiltinSkyParameters builtinParams, bool renderForCubemap, bool renderSunDisk) { } + /// + /// Whether the PreRenderSky step is required. + /// + /// Engine parameters that you can use to render the sky. + /// True if the PreRenderSky step is required. + public virtual bool RequiresPreRenderSky(BuiltinSkyParameters builtinParams) { return false; } + + /// /// Implements actual rendering of the sky. HDRP calls this when rendering the sky into a cubemap (for lighting) and also during main frame rendering. ///