using System; using UnityEngine.Experimental.Rendering; using UnityEngine.Experimental.Rendering.RenderGraphModule; namespace UnityEngine.Rendering.HighDefinition { public partial class HDRenderPipeline { DebugOverlay m_DebugOverlay = new DebugOverlay(); TextureHandle m_DebugFullScreenTexture; ComputeBufferHandle m_DebugFullScreenComputeBuffer; class TransparencyOverdrawPassData { public TransparencyOverdrawParameters parameters; public TextureHandle output; public TextureHandle depthBuffer; public RendererListHandle transparencyRL; public RendererListHandle transparencyAfterPostRL; public RendererListHandle transparencyLowResRL; } void RenderTransparencyOverdraw(RenderGraph renderGraph, TextureHandle depthBuffer, CullingResults cull, HDCamera hdCamera) { if (m_CurrentDebugDisplaySettings.IsDebugDisplayEnabled() && m_CurrentDebugDisplaySettings.data.fullScreenDebugMode == FullScreenDebugMode.TransparencyOverdraw) { TextureHandle transparencyOverdrawOutput = TextureHandle.nullHandle; using (var builder = renderGraph.AddRenderPass("Transparency Overdraw", out var passData)) { passData.parameters = PrepareTransparencyOverdrawParameters(hdCamera, cull); passData.output = builder.WriteTexture(renderGraph.CreateTexture(new TextureDesc(Vector2.one, true, true) { colorFormat = GetColorBufferFormat() })); passData.depthBuffer = builder.ReadTexture(depthBuffer); passData.transparencyRL = builder.UseRendererList(renderGraph.CreateRendererList(passData.parameters.transparencyRL)); passData.transparencyAfterPostRL = builder.UseRendererList(renderGraph.CreateRendererList(passData.parameters.transparencyAfterPostRL)); passData.transparencyLowResRL = builder.UseRendererList(renderGraph.CreateRendererList(passData.parameters.transparencyLowResRL)); builder.SetRenderFunc( (TransparencyOverdrawPassData data, RenderGraphContext ctx) => { RenderTransparencyOverdraw(data.parameters, data.output, data.depthBuffer, data.transparencyRL, data.transparencyAfterPostRL, data.transparencyLowResRL, ctx.renderContext, ctx.cmd); }); transparencyOverdrawOutput = passData.output; } PushFullScreenDebugTexture(renderGraph, transparencyOverdrawOutput, FullScreenDebugMode.TransparencyOverdraw); } } class FullScreenDebugPassData { public FullScreenDebugParameters parameters; public TextureHandle output; public TextureHandle depthBuffer; public ComputeBufferHandle debugBuffer; public RendererListHandle rendererList; } void RenderFullScreenDebug(RenderGraph renderGraph, TextureHandle colorBuffer, TextureHandle depthBuffer, CullingResults cull, HDCamera hdCamera) { TextureHandle fullscreenDebugOutput = TextureHandle.nullHandle; ComputeBufferHandle fullscreenDebugBuffer = ComputeBufferHandle.nullHandle; using (var builder = renderGraph.AddRenderPass("FullScreen Debug", out var passData)) { passData.parameters = PrepareFullScreenDebugParameters(hdCamera, cull); passData.output = builder.WriteTexture(colorBuffer); passData.depthBuffer = builder.ReadTexture(depthBuffer); passData.debugBuffer = builder.WriteComputeBuffer(renderGraph.CreateComputeBuffer(new ComputeBufferDesc(hdCamera.actualWidth * hdCamera.actualHeight * hdCamera.viewCount, sizeof(uint)))); passData.rendererList = builder.UseRendererList(renderGraph.CreateRendererList(passData.parameters.rendererList)); builder.SetRenderFunc( (FullScreenDebugPassData data, RenderGraphContext ctx) => { RenderFullScreenDebug(data.parameters, data.output, data.depthBuffer, data.debugBuffer, data.rendererList, ctx.renderContext, ctx.cmd); }); fullscreenDebugOutput = passData.output; fullscreenDebugBuffer = passData.debugBuffer; } m_DebugFullScreenComputeBuffer = fullscreenDebugBuffer; PushFullScreenDebugTexture(renderGraph, ResolveMSAAColor(renderGraph, hdCamera, fullscreenDebugOutput)); } class ResolveFullScreenDebugPassData { public DebugParameters debugParameters; public TextureHandle output; public TextureHandle input; public TextureHandle depthPyramid; public ComputeBufferHandle fullscreenBuffer; } TextureHandle ResolveFullScreenDebug(RenderGraph renderGraph, in DebugParameters debugParameters, TextureHandle inputFullScreenDebug, TextureHandle depthPyramid) { using (var builder = renderGraph.AddRenderPass("ResolveFullScreenDebug", out var passData)) { passData.debugParameters = debugParameters; passData.input = builder.ReadTexture(inputFullScreenDebug); passData.depthPyramid = builder.ReadTexture(depthPyramid); // On Vulkan, not binding the Random Write Target will result in an invalid drawcall. // To avoid that, if the compute buffer is invalid, we bind a dummy compute buffer anyway. if (m_DebugFullScreenComputeBuffer.IsValid()) passData.fullscreenBuffer = builder.ReadComputeBuffer(m_DebugFullScreenComputeBuffer); else passData.fullscreenBuffer = builder.CreateTransientComputeBuffer(new ComputeBufferDesc(4, sizeof(uint))); passData.output = builder.WriteTexture(renderGraph.CreateTexture(new TextureDesc(Vector2.one, true, true) { colorFormat = GraphicsFormat.R16G16B16A16_SFloat, name = "ResolveFullScreenDebug" })); builder.SetRenderFunc( (ResolveFullScreenDebugPassData data, RenderGraphContext ctx) => { ResolveFullScreenDebug(data.debugParameters, ctx.renderGraphPool.GetTempMaterialPropertyBlock(), data.input, data.depthPyramid, data.output, data.fullscreenBuffer, ctx.cmd); }); return passData.output; } } class ResolveColorPickerDebugPassData { public DebugParameters debugParameters; public TextureHandle output; public TextureHandle input; } TextureHandle ResolveColorPickerDebug(RenderGraph renderGraph, in DebugParameters debugParameters, TextureHandle inputColorPickerDebug) { using (var builder = renderGraph.AddRenderPass("ResolveColorPickerDebug", out var passData)) { passData.debugParameters = debugParameters; passData.input = builder.ReadTexture(inputColorPickerDebug); passData.output = builder.WriteTexture(renderGraph.CreateTexture(new TextureDesc(Vector2.one, true, true) { colorFormat = GraphicsFormat.R16G16B16A16_SFloat, name = "ResolveColorPickerDebug" })); builder.SetRenderFunc( (ResolveColorPickerDebugPassData data, RenderGraphContext ctx) => { ResolveColorPickerDebug(data.debugParameters, data.input, data.output, ctx.cmd); }); return passData.output; } } class DebugOverlayPassData { public DebugParameters debugParameters; public TextureHandle colorBuffer; public TextureHandle depthBuffer; } void RenderSkyReflectionOverlay(RenderGraph renderGraph, in DebugParameters debugParameters, TextureHandle colorBuffer, TextureHandle depthBuffer) { var lightingDebug = debugParameters.debugDisplaySettings.data.lightingDebugSettings; if (!lightingDebug.displaySkyReflection) return; using (var builder = renderGraph.AddRenderPass("SkyReflectionOverlay", out var passData)) { passData.debugParameters = debugParameters; passData.colorBuffer = builder.UseColorBuffer(colorBuffer, 0); passData.depthBuffer = builder.UseDepthBuffer(depthBuffer, DepthAccess.ReadWrite); builder.SetRenderFunc( (DebugOverlayPassData data, RenderGraphContext ctx) => { RenderSkyReflectionOverlay(data.debugParameters, ctx.cmd, ctx.renderGraphPool.GetTempMaterialPropertyBlock()); }); } } void RenderRayCountOverlay(RenderGraph renderGraph, in DebugParameters debugParameters, TextureHandle colorBuffer, TextureHandle depthBuffer, TextureHandle rayCountTexture) { if (!debugParameters.rayTracingSupported) return; debugParameters.rayCountManager.EvaluateRayCount(renderGraph, debugParameters.hdCamera, colorBuffer, depthBuffer, rayCountTexture); } class DebugLightLoopOverlayPassData : DebugOverlayPassData { public TextureHandle depthPyramidTexture; public ComputeBufferHandle tileList; public ComputeBufferHandle lightList; public ComputeBufferHandle perVoxelLightList; public ComputeBufferHandle dispatchIndirect; } void RenderLightLoopDebugOverlay(RenderGraph renderGraph, in DebugParameters debugParameters, TextureHandle colorBuffer, TextureHandle depthBuffer, in BuildGPULightListOutput lightLists, TextureHandle depthPyramidTexture) { var lightingDebug = debugParameters.debugDisplaySettings.data.lightingDebugSettings; if (lightingDebug.tileClusterDebug == TileClusterDebug.None && !lightingDebug.displayCookieAtlas && !lightingDebug.displayPlanarReflectionProbeAtlas) return; using (var builder = renderGraph.AddRenderPass("RenderLightLoopDebugOverlay", out var passData)) { passData.debugParameters = debugParameters; passData.colorBuffer = builder.UseColorBuffer(colorBuffer, 0); passData.depthBuffer = builder.UseDepthBuffer(depthBuffer, DepthAccess.ReadWrite); if (lightingDebug.tileClusterDebug != TileClusterDebug.None) { passData.depthPyramidTexture = builder.ReadTexture(depthPyramidTexture); passData.tileList = builder.ReadComputeBuffer(lightLists.tileList); passData.lightList = builder.ReadComputeBuffer(lightLists.lightList); passData.perVoxelLightList = builder.ReadComputeBuffer(lightLists.perVoxelLightLists); passData.dispatchIndirect = builder.ReadComputeBuffer(lightLists.dispatchIndirectBuffer); } builder.SetRenderFunc( (DebugLightLoopOverlayPassData data, RenderGraphContext ctx) => { RenderLightLoopDebugOverlay(data.debugParameters, ctx.cmd, data.tileList, data.lightList, data.perVoxelLightList, data.dispatchIndirect, data.depthPyramidTexture); }); } } void RenderProbeVolumeDebugOverlay(RenderGraph renderGraph, in DebugParameters debugParameters, TextureHandle colorBuffer, TextureHandle depthBuffer) { if (!m_SupportProbeVolume || debugParameters.debugDisplaySettings.data.lightingDebugSettings.probeVolumeDebugMode == ProbeVolumeDebugMode.None) return; using (var builder = renderGraph.AddRenderPass("RenderProbeVolumeDebugOverlay", out var passData)) { passData.debugParameters = debugParameters; passData.colorBuffer = builder.UseColorBuffer(colorBuffer, 0); passData.depthBuffer = builder.UseDepthBuffer(depthBuffer, DepthAccess.ReadWrite); builder.SetRenderFunc( (DebugLightLoopOverlayPassData data, RenderGraphContext ctx) => { RenderProbeVolumeDebugOverlay(data.debugParameters, ctx.cmd); }); } } class RenderShadowsDebugOverlayPassData : DebugOverlayPassData { public ShadowResult shadowTextures; } void RenderShadowsDebugOverlay(RenderGraph renderGraph, in DebugParameters debugParameters, TextureHandle colorBuffer, TextureHandle depthBuffer, in ShadowResult shadowResult) { LightingDebugSettings lightingDebug = debugParameters.debugDisplaySettings.data.lightingDebugSettings; if (lightingDebug.shadowDebugMode == ShadowMapDebugMode.None) return; using (var builder = renderGraph.AddRenderPass("RenderShadowsDebugOverlay", out var passData)) { passData.debugParameters = debugParameters; passData.colorBuffer = builder.UseColorBuffer(colorBuffer, 0); passData.depthBuffer = builder.UseDepthBuffer(depthBuffer, DepthAccess.ReadWrite); passData.shadowTextures = HDShadowManager.ReadShadowResult(shadowResult, builder); builder.SetRenderFunc( (RenderShadowsDebugOverlayPassData data, RenderGraphContext ctx) => { var debugParams = data.debugParameters; var shadowAtlases = new HDShadowManager.ShadowDebugAtlasTextures(); shadowAtlases.punctualShadowAtlas = data.shadowTextures.punctualShadowResult; shadowAtlases.cascadeShadowAtlas = data.shadowTextures.directionalShadowResult; shadowAtlases.areaShadowAtlas = data.shadowTextures.areaShadowResult; shadowAtlases.cachedPunctualShadowAtlas = data.shadowTextures.cachedPunctualShadowResult; shadowAtlases.cachedAreaShadowAtlas = data.shadowTextures.cachedAreaShadowResult; RenderShadowsDebugOverlay(debugParams, shadowAtlases, ctx.cmd, ctx.renderGraphPool.GetTempMaterialPropertyBlock()); }); } } void RenderDecalOverlay(RenderGraph renderGraph, in DebugParameters debugParameters, TextureHandle colorBuffer, TextureHandle depthBuffer) { if (!debugParameters.debugDisplaySettings.data.decalsDebugSettings.displayAtlas) return; using (var builder = renderGraph.AddRenderPass("SkyReflectionOverlay", out var passData)) { passData.debugParameters = debugParameters; passData.colorBuffer = builder.UseColorBuffer(colorBuffer, 0); passData.depthBuffer = builder.UseDepthBuffer(depthBuffer, DepthAccess.ReadWrite); builder.SetRenderFunc( (DebugOverlayPassData data, RenderGraphContext ctx) => { DecalSystem.instance.RenderDebugOverlay(data.debugParameters.hdCamera, ctx.cmd, data.debugParameters.debugDisplaySettings, data.debugParameters.debugOverlay); }); } } void RenderDebugOverlays(RenderGraph renderGraph, in DebugParameters debugParameters, TextureHandle colorBuffer, TextureHandle depthBuffer, TextureHandle depthPyramidTexture, TextureHandle rayCountTexture, in BuildGPULightListOutput lightLists, in ShadowResult shadowResult) { RenderSkyReflectionOverlay(renderGraph, debugParameters, colorBuffer, depthBuffer); RenderRayCountOverlay(renderGraph, debugParameters, colorBuffer, depthBuffer, rayCountTexture); RenderLightLoopDebugOverlay(renderGraph, debugParameters, colorBuffer, depthBuffer, lightLists, depthPyramidTexture); RenderProbeVolumeDebugOverlay(renderGraph, debugParameters, colorBuffer, depthBuffer); RenderShadowsDebugOverlay(renderGraph, debugParameters, colorBuffer, depthBuffer, shadowResult); RenderDecalOverlay(renderGraph, debugParameters, colorBuffer, depthBuffer); } class RenderLightVolumesPassData { public DebugLightVolumes.RenderLightVolumesParameters parameters; // Render target that holds the light count in floating points public TextureHandle lightCountBuffer; // Render target that holds the color accumulated value public TextureHandle colorAccumulationBuffer; // The output texture of the debug public TextureHandle debugLightVolumesTexture; // Required depth texture given that we render multiple render targets public TextureHandle depthBuffer; public TextureHandle destination; } static void RenderLightVolumes(RenderGraph renderGraph, in DebugParameters debugParameters, TextureHandle destination, TextureHandle depthBuffer, CullingResults cullResults) { using (var builder = renderGraph.AddRenderPass("LightVolumes", out var passData)) { passData.parameters = s_lightVolumes.PrepareLightVolumeParameters(debugParameters.hdCamera, debugParameters.debugDisplaySettings.data.lightingDebugSettings, cullResults); passData.lightCountBuffer = builder.CreateTransientTexture(new TextureDesc(Vector2.one, true, true) { colorFormat = GraphicsFormat.R32_SFloat, clearBuffer = true, clearColor = Color.black, name = "LightVolumeCount" }); passData.colorAccumulationBuffer = builder.CreateTransientTexture(new TextureDesc(Vector2.one, true, true) { colorFormat = GraphicsFormat.R16G16B16A16_SFloat, clearBuffer = true, clearColor = Color.black, name = "LightVolumeColorAccumulation" }); passData.debugLightVolumesTexture = builder.CreateTransientTexture(new TextureDesc(Vector2.one, true, true) { colorFormat = GraphicsFormat.R16G16B16A16_SFloat, clearBuffer = true, clearColor = Color.black, enableRandomWrite = true, name = "LightVolumeDebugLightVolumesTexture" }); passData.depthBuffer = builder.UseDepthBuffer(depthBuffer, DepthAccess.ReadWrite); passData.destination = builder.WriteTexture(destination); builder.SetRenderFunc( (RenderLightVolumesPassData data, RenderGraphContext ctx) => { RenderTargetIdentifier[] mrt = ctx.renderGraphPool.GetTempArray(2); mrt[0] = data.lightCountBuffer; mrt[1] = data.colorAccumulationBuffer; DebugLightVolumes.RenderLightVolumes(ctx.cmd, data.parameters, mrt, data.lightCountBuffer, data.colorAccumulationBuffer, data.debugLightVolumesTexture, data.depthBuffer, data.destination, ctx.renderGraphPool.GetTempMaterialPropertyBlock()); }); } } class DebugImageHistogramData { public PostProcessSystem.DebugImageHistogramParameters parameters; public TextureHandle source; } void GenerateDebugImageHistogram(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle source) { using (var builder = renderGraph.AddRenderPass("Generate Debug Image Histogram", out var passData, ProfilingSampler.Get(HDProfileId.FinalImageHistogram))) { passData.source = builder.ReadTexture(source); passData.parameters = m_PostProcessSystem.PrepareDebugImageHistogramParameters(hdCamera); builder.SetRenderFunc( (DebugImageHistogramData data, RenderGraphContext ctx) => { PostProcessSystem.GenerateDebugImageHistogram(data.parameters, ctx.cmd, data.source); }); } } class DebugExposureData { public DebugParameters debugParameters; public Vector4 proceduralMeteringParams1; public Vector4 proceduralMeteringParams2; public TextureHandle colorBuffer; public TextureHandle debugFullScreenTexture; public TextureHandle output; public TextureHandle currentExposure; public TextureHandle previousExposure; public TextureHandle debugExposureData; public HableCurve customToneMapCurve; public int lutSize; public ComputeBuffer histogramBuffer; } TextureHandle RenderExposureDebug(RenderGraph renderGraph, HDCamera hdCamera, DebugParameters debugParameters, TextureHandle colorBuffer) { using (var builder = renderGraph.AddRenderPass("Debug Exposure", out var passData)) { m_PostProcessSystem.ComputeProceduralMeteringParams(hdCamera, out passData.proceduralMeteringParams1, out passData.proceduralMeteringParams2); passData.debugParameters = debugParameters; passData.colorBuffer = builder.ReadTexture(colorBuffer); passData.debugFullScreenTexture = builder.ReadTexture(m_DebugFullScreenTexture); passData.output = builder.WriteTexture(renderGraph.CreateTexture(new TextureDesc(Vector2.one, true, true) { colorFormat = GraphicsFormat.R16G16B16A16_SFloat, name = "ExposureDebug" })); passData.currentExposure = builder.ReadTexture(renderGraph.ImportTexture(m_PostProcessSystem.GetExposureTexture(hdCamera))); passData.previousExposure = builder.ReadTexture(renderGraph.ImportTexture(m_PostProcessSystem.GetPreviousExposureTexture(hdCamera))); passData.debugExposureData = builder.ReadTexture(renderGraph.ImportTexture(m_PostProcessSystem.GetExposureDebugData())); passData.customToneMapCurve = m_PostProcessSystem.GetCustomToneMapCurve(); passData.lutSize = m_PostProcessSystem.GetLutSize(); passData.histogramBuffer = debugParameters.debugDisplaySettings.data.lightingDebugSettings.exposureDebugMode == ExposureDebugMode.FinalImageHistogramView ? m_PostProcessSystem.GetDebugImageHistogramBuffer() : m_PostProcessSystem.GetHistogramBuffer(); builder.SetRenderFunc( (DebugExposureData data, RenderGraphContext ctx) => { RenderExposureDebug(data.debugParameters, data.colorBuffer, data.debugFullScreenTexture, data.previousExposure, data.currentExposure, data.debugExposureData, data.output, data.customToneMapCurve, data.lutSize, data.proceduralMeteringParams1, data.proceduralMeteringParams2, data.histogramBuffer, ctx.cmd); }); return passData.output; } } TextureHandle RenderDebug(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle colorBuffer, TextureHandle depthBuffer, TextureHandle depthPyramidTexture, TextureHandle colorPickerDebugTexture, TextureHandle rayCountTexture, in BuildGPULightListOutput lightLists, in ShadowResult shadowResult, CullingResults cullResults) { // We don't want any overlay for these kind of rendering if (hdCamera.camera.cameraType == CameraType.Reflection || hdCamera.camera.cameraType == CameraType.Preview) return colorBuffer; TextureHandle output = colorBuffer; var debugParameters = PrepareDebugParameters(hdCamera, GetDepthBufferMipChainInfo()); if (debugParameters.resolveFullScreenDebug) { output = ResolveFullScreenDebug(renderGraph, debugParameters, m_DebugFullScreenTexture, depthPyramidTexture); // If we have full screen debug, this is what we want color picked, so we replace color picker input texture with the new one. if (debugParameters.colorPickerEnabled) colorPickerDebugTexture = PushColorPickerDebugTexture(renderGraph, output); m_FullScreenDebugPushed = false; m_DebugFullScreenComputeBuffer = ComputeBufferHandle.nullHandle; } if (debugParameters.exposureDebugEnabled) output = RenderExposureDebug(renderGraph, hdCamera, debugParameters, colorBuffer); if (debugParameters.colorPickerEnabled) output = ResolveColorPickerDebug(renderGraph, debugParameters, colorPickerDebugTexture); if (debugParameters.debugDisplaySettings.data.lightingDebugSettings.displayLightVolumes) { RenderLightVolumes(renderGraph, debugParameters, output, depthBuffer, cullResults); } RenderDebugOverlays(renderGraph, debugParameters, output, depthBuffer, depthPyramidTexture, rayCountTexture, lightLists, shadowResult); return output; } class DebugViewMaterialData { public TextureHandle outputColor; public TextureHandle outputDepth; public RendererListHandle opaqueRendererList; public RendererListHandle transparentRendererList; public Material debugGBufferMaterial; public FrameSettings frameSettings; public bool decalsEnabled; public ComputeBufferHandle perVoxelOffset; public DBufferOutput dbuffer; public GBufferOutput gbuffer; public Texture clearColorTexture; public RenderTexture clearDepthTexture; public bool clearDepth; } TextureHandle RenderDebugViewMaterial(RenderGraph renderGraph, CullingResults cull, HDCamera hdCamera, BuildGPULightListOutput lightLists, DBufferOutput dbuffer, GBufferOutput gbuffer) { bool msaa = hdCamera.frameSettings.IsEnabled(FrameSettingsField.MSAA); var output = renderGraph.CreateTexture( new TextureDesc(Vector2.one, true, true) { colorFormat = GetColorBufferFormat(), enableRandomWrite = !msaa, bindTextureMS = msaa, enableMSAA = msaa, clearBuffer = true, clearColor = Color.clear, name = msaa ? "CameraColorMSAA" : "CameraColor" }); if (m_CurrentDebugDisplaySettings.data.materialDebugSettings.IsDebugGBufferEnabled() && hdCamera.frameSettings.litShaderMode == LitShaderMode.Deferred) { using (var builder = renderGraph.AddRenderPass("DebugViewMaterialGBuffer", out var passData, ProfilingSampler.Get(HDProfileId.DebugViewMaterialGBuffer))) { passData.debugGBufferMaterial = m_currentDebugViewMaterialGBuffer; passData.outputColor = builder.WriteTexture(output); passData.gbuffer = ReadGBuffer(gbuffer, builder); builder.SetRenderFunc( (DebugViewMaterialData data, RenderGraphContext context) => { var gbufferHandles = data.gbuffer; for (int i = 0; i < gbufferHandles.gBufferCount; ++i) { data.debugGBufferMaterial.SetTexture(HDShaderIDs._GBufferTexture[i], gbufferHandles.mrt[i]); } HDUtils.DrawFullScreen(context.cmd, data.debugGBufferMaterial, data.outputColor); }); } } else { using (var builder = renderGraph.AddRenderPass("DisplayDebug ViewMaterial", out var passData, ProfilingSampler.Get(HDProfileId.DisplayDebugViewMaterial))) { passData.frameSettings = hdCamera.frameSettings; passData.outputColor = builder.UseColorBuffer(output, 0); passData.outputDepth = builder.UseDepthBuffer(CreateDepthBuffer(renderGraph, true, hdCamera.frameSettings.IsEnabled(FrameSettingsField.MSAA)), DepthAccess.ReadWrite); // When rendering debug material we shouldn't rely on a depth prepass for optimizing the alpha clip test. As it is control on the material inspector side // we must override the state here. passData.opaqueRendererList = builder.UseRendererList( renderGraph.CreateRendererList(CreateOpaqueRendererListDesc(cull, hdCamera.camera, m_AllForwardOpaquePassNames, rendererConfiguration: m_CurrentRendererConfigurationBakedLighting, stateBlock: m_DepthStateOpaque))); passData.transparentRendererList = builder.UseRendererList( renderGraph.CreateRendererList(CreateTransparentRendererListDesc(cull, hdCamera.camera, m_AllTransparentPassNames, rendererConfiguration: m_CurrentRendererConfigurationBakedLighting, stateBlock: m_DepthStateOpaque))); passData.decalsEnabled = (hdCamera.frameSettings.IsEnabled(FrameSettingsField.Decals)) && (DecalSystem.m_DecalDatasCount > 0); passData.perVoxelOffset = builder.ReadComputeBuffer(lightLists.perVoxelOffset); passData.dbuffer = ReadDBuffer(dbuffer, builder); passData.clearColorTexture = Compositor.CompositionManager.GetClearTextureForStackedCamera(hdCamera); // returns null if is not a stacked camera passData.clearDepthTexture = Compositor.CompositionManager.GetClearDepthForStackedCamera(hdCamera); // returns null if is not a stacked camera passData.clearDepth = hdCamera.clearDepth; builder.SetRenderFunc( (DebugViewMaterialData data, RenderGraphContext context) => { // If we are doing camera stacking, then we want to clear the debug color and depth buffer using the data from the previous camera on the stack // Note: Ideally here we would like to draw directly on the same buffers as the previous camera, but currently the compositor is not using // Texture Arrays so this would not work. We might need to revise this in the future. if (data.clearColorTexture != null) { HDUtils.BlitColorAndDepth(context.cmd, data.clearColorTexture, data.clearDepthTexture, new Vector4(1, 1, 0, 0), 0, !data.clearDepth); } BindDBufferGlobalData(data.dbuffer, context); DrawOpaqueRendererList(context, data.frameSettings, data.opaqueRendererList); if (data.decalsEnabled) DecalSystem.instance.SetAtlas(context.cmd); // for clustered decals if (data.perVoxelOffset.IsValid()) context.cmd.SetGlobalBuffer(HDShaderIDs.g_vLayeredOffsetsBuffer, data.perVoxelOffset); DrawTransparentRendererList(context, data.frameSettings, data.transparentRendererList); }); } } return output; } class PushFullScreenDebugPassData { public TextureHandle input; public TextureHandle output; public int mipIndex; } void PushFullScreenLightingDebugTexture(RenderGraph renderGraph, TextureHandle input) { // In practice, this is only useful for the SingleShadow debug view. // TODO: See how we can make this nicer than a specific functions just for one case. if (NeedsFullScreenDebugMode() && m_FullScreenDebugPushed == false) { PushFullScreenDebugTexture(renderGraph, input); } } internal void PushFullScreenDebugTexture(RenderGraph renderGraph, TextureHandle input, FullScreenDebugMode debugMode) { if (debugMode == m_CurrentDebugDisplaySettings.data.fullScreenDebugMode) { PushFullScreenDebugTexture(renderGraph, input); } } void PushFullScreenDebugTextureMip(RenderGraph renderGraph, TextureHandle input, int lodCount, Vector4 scaleBias, FullScreenDebugMode debugMode) { if (debugMode == m_CurrentDebugDisplaySettings.data.fullScreenDebugMode) { var mipIndex = Mathf.FloorToInt(m_CurrentDebugDisplaySettings.data.fullscreenDebugMip * lodCount); PushFullScreenDebugTexture(renderGraph, input, mipIndex); } } void PushFullScreenDebugTexture(RenderGraph renderGraph, TextureHandle input, int mipIndex = -1) { using (var builder = renderGraph.AddRenderPass("Push Full Screen Debug", out var passData)) { passData.mipIndex = mipIndex; passData.input = builder.ReadTexture(input); passData.output = builder.UseColorBuffer(renderGraph.CreateTexture(new TextureDesc(Vector2.one, true, true) { colorFormat = GraphicsFormat.R16G16B16A16_SFloat, name = "DebugFullScreen" }), 0); builder.SetRenderFunc( (PushFullScreenDebugPassData data, RenderGraphContext ctx) => { if (data.mipIndex != -1) HDUtils.BlitCameraTexture(ctx.cmd, data.input, data.output, data.mipIndex); else HDUtils.BlitCameraTexture(ctx.cmd, data.input, data.output); }); m_DebugFullScreenTexture = passData.output; } // We need this flag because otherwise if no full screen debug is pushed (like for example if the corresponding pass is disabled), when we render the result in RenderDebug m_DebugFullScreenTempBuffer will contain potential garbage m_FullScreenDebugPushed = true; } void PushFullScreenExposureDebugTexture(RenderGraph renderGraph, TextureHandle input) { if (m_CurrentDebugDisplaySettings.data.lightingDebugSettings.exposureDebugMode != ExposureDebugMode.None) { PushFullScreenDebugTexture(renderGraph, input); } } #if ENABLE_VIRTUALTEXTURES class PushFullScreenVTDebugPassData { public TextureHandle input; public TextureHandle output; public Material material; public bool msaa; } void PushFullScreenVTFeedbackDebugTexture(RenderGraph renderGraph, TextureHandle input, bool msaa) { if (FullScreenDebugMode.RequestedVirtualTextureTiles == m_CurrentDebugDisplaySettings.data.fullScreenDebugMode) { using (var builder = renderGraph.AddRenderPass("Push Full Screen Debug", out var passData)) { passData.material = m_VTDebugBlit; passData.msaa = msaa; passData.input = builder.ReadTexture(input); passData.output = builder.UseColorBuffer(renderGraph.CreateTexture(new TextureDesc(Vector2.one, true, true) { colorFormat = GraphicsFormat.R16G16B16A16_SFloat, name = "DebugFullScreen" }), 0); builder.SetRenderFunc( (PushFullScreenVTDebugPassData data, RenderGraphContext ctx) => { CoreUtils.SetRenderTarget(ctx.cmd, data.output); data.material.SetTexture(data.msaa ? HDShaderIDs._BlitTextureMSAA : HDShaderIDs._BlitTexture, data.input); ctx.cmd.DrawProcedural(Matrix4x4.identity, data.material, data.msaa ? 1 : 0, MeshTopology.Triangles, 3, 1); }); m_DebugFullScreenTexture = passData.output; } m_FullScreenDebugPushed = true; } } #endif TextureHandle PushColorPickerDebugTexture(RenderGraph renderGraph, TextureHandle input) { using (var builder = renderGraph.AddRenderPass("Push To Color Picker", out var passData)) { passData.input = builder.ReadTexture(input); passData.output = builder.UseColorBuffer(renderGraph.CreateTexture(new TextureDesc(Vector2.one, true, true) { colorFormat = GraphicsFormat.R16G16B16A16_SFloat, name = "DebugColorPicker" }), 0); builder.SetRenderFunc( (PushFullScreenDebugPassData data, RenderGraphContext ctx) => { HDUtils.BlitCameraTexture(ctx.cmd, data.input, data.output); }); return passData.output; } } } }