From 9d7a922df16c6a0a54b83a9a3104d93948eba542 Mon Sep 17 00:00:00 2001 From: FrancescoC-Unity Date: Mon, 19 Oct 2020 13:04:21 +0200 Subject: [PATCH 1/8] Fix rendergraph default resources init --- .../Runtime/RenderGraph/RenderGraph.cs | 3 +- .../RenderGraphDefaultResources.cs | 31 ++++++------------- 2 files changed, 11 insertions(+), 23 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; - } } } From 031bd9b631794035024e0ad4bfb488f67333ac6d Mon Sep 17 00:00:00 2001 From: FrancescoC-Unity Date: Mon, 19 Oct 2020 13:05:21 +0200 Subject: [PATCH 2/8] Make sure passes are skipped when opaque and transparents objects are off --- .../Shadow/HDShadowManager.RenderGraph.cs | 2 +- .../HDRenderPipeline.Prepass.cs | 33 ++++++++++++++++--- .../HDRenderPipeline.RenderGraph.cs | 31 ++++++++++++++--- .../HDRenderPipeline.SubsurfaceScattering.cs | 3 +- 4 files changed, 59 insertions(+), 10 deletions(-) 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..0d411a5b31e 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,7 @@ 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)) { 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..7e91b173911 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,9 @@ 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) || + // Merge the two settings TODO_FCC + !hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects)) { // Return all black textures for default values. var blackTexture = renderGraph.defaultResources.blackTextureXR; @@ -854,7 +872,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 +968,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 5d82c8928aa..80417abb55e 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 @@ -500,6 +500,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))) @@ -561,6 +564,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; @@ -645,7 +651,8 @@ void RenderForwardTransparent( RenderGraph renderGraph, void RenderTransparentDepthPrepass(RenderGraph renderGraph, HDCamera hdCamera, in PrepassOutput prepassOutput, CullingResults cull) { - if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.TransparentPrepass)) + if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.TransparentPrepass) || + !hdCamera.frameSettings.IsEnabled(FrameSettingsField.TransparentObjects)) return; using (var builder = renderGraph.AddRenderPass("Transparent Depth Prepass", out var passData, ProfilingSampler.Get(HDProfileId.TransparentDepthPrepass))) @@ -669,7 +676,8 @@ void RenderTransparentDepthPrepass(RenderGraph renderGraph, HDCamera hdCamera, i void RenderTransparentDepthPostpass(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle depthStencilBuffer, CullingResults cull) { - if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.TransparentPostpass)) + if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.TransparentPostpass) || + !hdCamera.frameSettings.IsEnabled(FrameSettingsField.TransparentObjects)) return; using (var builder = renderGraph.AddRenderPass("Transparent Depth Postpass", out var passData, ProfilingSampler.Get(HDProfileId.TransparentDepthPostpass))) @@ -891,7 +899,8 @@ TextureHandle RenderTransparency( RenderGraph renderGraph, // Render All forward error RenderForwardError(renderGraph, hdCamera, colorBuffer, prepassOutput.resolvedDepthBuffer, cullingResults); - if (hdCamera.frameSettings.IsEnabled(FrameSettingsField.LowResTransparent)) + if (hdCamera.frameSettings.IsEnabled(FrameSettingsField.LowResTransparent) && + hdCamera.frameSettings.IsEnabled(FrameSettingsField.TransparentObjects)) { var lowResTransparentBuffer = RenderLowResTransparent(renderGraph, hdCamera, prepassOutput.downsampledDepthBuffer, cullingResults); UpsampleTransparent(renderGraph, hdCamera, colorBuffer, lowResTransparentBuffer, prepassOutput.downsampledDepthBuffer); @@ -915,6 +924,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); @@ -941,6 +956,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); @@ -1046,7 +1068,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.HasBackplateEnabled(hdCamera)) { return; } diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.SubsurfaceScattering.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.SubsurfaceScattering.cs index ba31930f9e3..a772254ae08 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.SubsurfaceScattering.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.SubsurfaceScattering.cs @@ -46,7 +46,8 @@ class SubsurfaceScaterringPassData void RenderSubsurfaceScattering(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle colorBuffer, in LightingBuffers lightingBuffers, ref PrepassOutput prepassOutput) { - if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.SubsurfaceScattering)) + if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.SubsurfaceScattering) || + !hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects)) return; BuildCoarseStencilAndResolveIfNeeded(renderGraph, hdCamera, resolveOnly: false, ref prepassOutput); From 9f31cb719c90f28b8cc6e91c5d49483837af8b04 Mon Sep 17 00:00:00 2001 From: FrancescoC-Unity Date: Mon, 19 Oct 2020 13:05:44 +0200 Subject: [PATCH 3/8] Skip pre render sky if backplate is disabled (? can we do this?) --- .../Runtime/Sky/HDRISky/HDRISkyRenderer.cs | 6 ++++++ .../Runtime/Sky/SkyManager.cs | 6 ++++++ .../Runtime/Sky/SkyRenderer.cs | 8 ++++++++ 3 files changed, 20 insertions(+) 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..b942602383f 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 HasBackplateEnabled(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 b37b39cae19..6c93c97972e 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyManager.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyManager.cs @@ -864,6 +864,12 @@ internal void UpdateBuiltinParameters(SkyUpdateContext skyContext, HDCamera hdCa m_BuiltinParameters.skySettings = skyContext.skySettings; } + public bool HasBackplateEnabled(HDCamera hdCamera) + { + var skyContext = hdCamera.visualSky; + return skyContext.IsValid() && skyContext.skyRenderer.HasBackplateEnabled(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..2a39289148b 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 sky renderer has sky backplate enabled. + /// + /// Engine parameters that you can use to render the sky. + /// True if backplate is enabled. + public virtual bool HasBackplateEnabled(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. /// From 3ca7c36e4e87fc9cc8730fb87a2579b4e09c4eea Mon Sep 17 00:00:00 2001 From: FrancescoC-Unity Date: Mon, 19 Oct 2020 13:09:31 +0200 Subject: [PATCH 4/8] More generic name for the pre render sky (in case is not tied to backplate in custom code) --- .../Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs | 2 +- .../Runtime/Sky/HDRISky/HDRISkyRenderer.cs | 2 +- .../Runtime/Sky/SkyManager.cs | 4 ++-- .../Runtime/Sky/SkyRenderer.cs | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) 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 80417abb55e..570d27e414e 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 @@ -1069,7 +1069,7 @@ class PreRenderSkyPassData void PreRenderSky(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle colorBuffer, TextureHandle depthStencilBuffer, TextureHandle normalbuffer) { if (m_CurrentDebugDisplaySettings.DebugHideSky(hdCamera) || - !m_SkyManager.HasBackplateEnabled(hdCamera)) + !m_SkyManager.RequiresPreRenderSky(hdCamera)) { return; } 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 b942602383f..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,7 +86,7 @@ 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 HasBackplateEnabled(BuiltinSkyParameters builtinParams) + public override bool RequiresPreRenderSky(BuiltinSkyParameters builtinParams) { var hdriSky = builtinParams.skySettings as HDRISky; return hdriSky.enableBackplate.value; 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 6c93c97972e..839f184ef5c 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyManager.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyManager.cs @@ -864,10 +864,10 @@ internal void UpdateBuiltinParameters(SkyUpdateContext skyContext, HDCamera hdCa m_BuiltinParameters.skySettings = skyContext.skySettings; } - public bool HasBackplateEnabled(HDCamera hdCamera) + public bool RequiresPreRenderSky(HDCamera hdCamera) { var skyContext = hdCamera.visualSky; - return skyContext.IsValid() && skyContext.skyRenderer.HasBackplateEnabled(m_BuiltinParameters); + 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) 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 2a39289148b..26c5ad3da60 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyRenderer.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Sky/SkyRenderer.cs @@ -36,11 +36,11 @@ public abstract class SkyRenderer public virtual void PreRenderSky(BuiltinSkyParameters builtinParams, bool renderForCubemap, bool renderSunDisk) { } /// - /// Whether the sky renderer has sky backplate enabled. + /// Whether the PreRenderSky step is required. /// /// Engine parameters that you can use to render the sky. - /// True if backplate is enabled. - public virtual bool HasBackplateEnabled(BuiltinSkyParameters builtinParams) { return false; } + /// True if the PreRenderSky step is required. + public virtual bool RequiresPreRenderSky(BuiltinSkyParameters builtinParams) { return false; } /// From ac28300b1fe45aca92832d5728818269ad40c472 Mon Sep 17 00:00:00 2001 From: FrancescoC-Unity Date: Mon, 19 Oct 2020 17:55:56 +0200 Subject: [PATCH 5/8] Skip clear stencil --- .../Runtime/RenderPipeline/HDRenderPipeline.RenderGraph.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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 570d27e414e..da9cdd7410f 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); From 2b5f05a1ca0c3baf4902291abd5e2970de8f28d8 Mon Sep 17 00:00:00 2001 From: FrancescoC-Unity Date: Mon, 19 Oct 2020 19:42:51 +0200 Subject: [PATCH 6/8] Use sanitization instead of checking opaque explicitly --- .../RenderPipeline/HDRenderPipeline.SubsurfaceScattering.cs | 3 +-- .../Runtime/RenderPipeline/Settings/FrameSettings.cs | 3 +++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.SubsurfaceScattering.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.SubsurfaceScattering.cs index a772254ae08..ba31930f9e3 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.SubsurfaceScattering.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDRenderPipeline.SubsurfaceScattering.cs @@ -46,8 +46,7 @@ class SubsurfaceScaterringPassData void RenderSubsurfaceScattering(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle colorBuffer, in LightingBuffers lightingBuffers, ref PrepassOutput prepassOutput) { - if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.SubsurfaceScattering) || - !hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects)) + if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.SubsurfaceScattering)) return; BuildCoarseStencilAndResolveIfNeeded(renderGraph, hdCamera, resolveOnly: false, ref prepassOutput); 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 35d57b997b1..d54065ff6ed 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 @@ -808,6 +808,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. From c937d7b7ed31cf6f0b16f31fad8195794fad7aa4 Mon Sep 17 00:00:00 2001 From: FrancescoC-Unity Date: Wed, 21 Oct 2020 14:17:55 +0200 Subject: [PATCH 7/8] Some merging of settings --- .../Runtime/RenderPipeline/HDRenderPipeline.Prepass.cs | 1 - .../RenderPipeline/HDRenderPipeline.RenderGraph.cs | 9 +++------ .../Runtime/RenderPipeline/Settings/FrameSettings.cs | 6 +++--- 3 files changed, 6 insertions(+), 10 deletions(-) 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 7e91b173911..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 @@ -800,7 +800,6 @@ void RenderDBuffer(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle dec bool use4RTs = m_Asset.currentPlatformRenderPipelineSettings.decalSettings.perChannelMask; if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.Decals) || - // Merge the two settings TODO_FCC !hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects)) { // Return all black textures for default values. 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 da9cdd7410f..7ab19a323de 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 @@ -654,8 +654,7 @@ void RenderForwardTransparent( RenderGraph renderGraph, void RenderTransparentDepthPrepass(RenderGraph renderGraph, HDCamera hdCamera, in PrepassOutput prepassOutput, CullingResults cull) { - if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.TransparentPrepass) || - !hdCamera.frameSettings.IsEnabled(FrameSettingsField.TransparentObjects)) + if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.TransparentPrepass)) return; using (var builder = renderGraph.AddRenderPass("Transparent Depth Prepass", out var passData, ProfilingSampler.Get(HDProfileId.TransparentDepthPrepass))) @@ -679,8 +678,7 @@ void RenderTransparentDepthPrepass(RenderGraph renderGraph, HDCamera hdCamera, i void RenderTransparentDepthPostpass(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle depthStencilBuffer, CullingResults cull) { - if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.TransparentPostpass) || - !hdCamera.frameSettings.IsEnabled(FrameSettingsField.TransparentObjects)) + if (!hdCamera.frameSettings.IsEnabled(FrameSettingsField.TransparentPostpass)) return; using (var builder = renderGraph.AddRenderPass("Transparent Depth Postpass", out var passData, ProfilingSampler.Get(HDProfileId.TransparentDepthPostpass))) @@ -902,8 +900,7 @@ TextureHandle RenderTransparency( RenderGraph renderGraph, // Render All forward error RenderForwardError(renderGraph, hdCamera, colorBuffer, prepassOutput.resolvedDepthBuffer, cullingResults); - if (hdCamera.frameSettings.IsEnabled(FrameSettingsField.LowResTransparent) && - hdCamera.frameSettings.IsEnabled(FrameSettingsField.TransparentObjects)) + if (hdCamera.frameSettings.IsEnabled(FrameSettingsField.LowResTransparent)) { var lowResTransparentBuffer = RenderLowResTransparent(renderGraph, hdCamera, prepassOutput.downsampledDepthBuffer, cullingResults); UpsampleTransparent(renderGraph, hdCamera, colorBuffer, lowResTransparentBuffer, prepassOutput.downsampledDepthBuffer); 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 d54065ff6ed..fab6d22a8ac 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 @@ -767,7 +767,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; @@ -777,11 +777,11 @@ 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]; sanitizedFrameSettings.bitDatas[(int)FrameSettingsField.Distortion] &= renderPipelineSettings.supportDistortion && !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; From 79dd56e37831ca75f25be878c72f783c5587eaf3 Mon Sep 17 00:00:00 2001 From: FrancescoC-Unity Date: Fri, 23 Oct 2020 09:59:30 +0200 Subject: [PATCH 8/8] missing transparent --- .../Runtime/Lighting/Shadow/HDShadowManager.RenderGraph.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 0d411a5b31e..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 && hdCamera.frameSettings.IsEnabled(FrameSettingsField.OpaqueObjects)) + 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);