From b615ac41b45353e1f807e75f291f4258053d09a5 Mon Sep 17 00:00:00 2001 From: Anis Date: Mon, 29 Jun 2020 13:24:31 +0200 Subject: [PATCH 1/2] - Render graph pre-setup for ray traced ambient occlusion. --- .../CHANGELOG.md | 1 + .../ScreenSpaceLighting/AmbientOcclusion.cs | 2 +- .../Runtime/RenderPipeline/HDProfileId.cs | 6 + .../HDRaytracingAmbientOcclusion.cs | 279 ++++++++++++++---- .../RenderPipeline/Utility/BlueNoise.cs | 28 ++ 5 files changed, 261 insertions(+), 55 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/CHANGELOG.md b/com.unity.render-pipelines.high-definition/CHANGELOG.md index 3d491d4abcc..1bf8dc7a15d 100644 --- a/com.unity.render-pipelines.high-definition/CHANGELOG.md +++ b/com.unity.render-pipelines.high-definition/CHANGELOG.md @@ -886,6 +886,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - PBR Sky now doesn't go black when going below sea level, but it instead freezes calculation as if on the horizon. - Fixed an issue with quality setting foldouts not opening when clicking on them (1253088). - Shutter speed can now be changed by dragging the mouse over the UI label (case 1245007). +- Render graph pre-setup for ray traced ambient occlusion. ## [7.1.1] - 2019-09-05 diff --git a/com.unity.render-pipelines.high-definition/Runtime/Lighting/ScreenSpaceLighting/AmbientOcclusion.cs b/com.unity.render-pipelines.high-definition/Runtime/Lighting/ScreenSpaceLighting/AmbientOcclusion.cs index c0f3f1cca03..6ebf0929214 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/Lighting/ScreenSpaceLighting/AmbientOcclusion.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/Lighting/ScreenSpaceLighting/AmbientOcclusion.cs @@ -311,7 +311,7 @@ internal void Render(CommandBuffer cmd, HDCamera camera, ScriptableRenderContext else { if (camera.frameSettings.IsEnabled(FrameSettingsField.RayTracing) && settings.rayTracing.value) - m_RaytracingAmbientOcclusion.RenderAO(camera, cmd, m_AmbientOcclusionTex, globalRTCB, renderContext, frameCount); + m_RaytracingAmbientOcclusion.RenderRTAO(camera, cmd, m_AmbientOcclusionTex, globalRTCB, renderContext, frameCount); else { Dispatch(cmd, camera, depthTexture, normalBuffer, frameCount); diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDProfileId.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDProfileId.cs index e2bf627d4e6..ade14e2603c 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDProfileId.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/HDProfileId.cs @@ -101,14 +101,20 @@ internal enum HDProfileId VolumetricLightingFiltering, PrepareVisibleDensityVolumeList, + // RT Cluster RaytracingBuildCluster, RaytracingCullLights, + // RTR RaytracingIntegrateReflection, RaytracingFilterReflection, + // RTAO RaytracingAmbientOcclusion, RaytracingFilterAmbientOcclusion, + RaytracingComposeAmbientOcclusion, + // RT Shadows RaytracingDirectionalLightShadow, RaytracingLightShadow, + // RTGI RaytracingIntegrateIndirectDiffuse, RaytracingFilterIndirectDiffuse, RaytracingDebugOverlay, diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/HDRaytracingAmbientOcclusion.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/HDRaytracingAmbientOcclusion.cs index 92817728576..2903011886c 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/HDRaytracingAmbientOcclusion.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/HDRaytracingAmbientOcclusion.cs @@ -5,14 +5,11 @@ namespace UnityEngine.Rendering.HighDefinition internal class HDRaytracingAmbientOcclusion { // External structures - RenderPipelineResources m_PipelineResources = null; HDRenderPipelineRayTracingResources m_PipelineRayTracingResources = null; - RenderPipelineSettings m_PipelineSettings; HDRenderPipeline m_RenderPipeline = null; // The target denoising kernel - static int m_KernelFilter; - static int m_RTAOApplyIntensityKernel; + int m_RTAOApplyIntensityKernel; // Intermediate buffer that stores the ambient occlusion pre-denoising RTHandle m_AOIntermediateBuffer0 = null; @@ -30,8 +27,6 @@ public HDRaytracingAmbientOcclusion() public void Init(HDRenderPipeline renderPipeline) { // Keep track of the pipeline asset - m_PipelineSettings = renderPipeline.currentPlatformRenderPipelineSettings; - m_PipelineResources = renderPipeline.asset.renderPipelineResources; m_PipelineRayTracingResources = renderPipeline.asset.renderPipelineRayTracingResources; // keep track of the render pipeline @@ -59,103 +54,279 @@ static RTHandle AmbientOcclusionHistoryBufferAllocatorFunction(string viewName, } - public void SetDefaultAmbientOcclusionTexture(CommandBuffer cmd) + static public void SetDefaultAmbientOcclusionTexture(CommandBuffer cmd) { cmd.SetGlobalTexture(HDShaderIDs._AmbientOcclusionTexture, TextureXR.GetBlackTexture()); } - public void RenderAO(HDCamera hdCamera, CommandBuffer cmd, RTHandle outputTexture, ShaderVariablesRaytracing globalCB, ScriptableRenderContext renderContext, int frameCount) + // The set of parameters that are used to trace the ambient occlusion + public struct AmbientOcclusionTraceParameters + { + // Generic attributes + public bool validRayTracing; + public float rayLength; + public int sampleCount; + + // Camera data + public int actualWidth; + public int actualHeight; + public int viewCount; + + // Shaders + public RayTracingShader aoShaderRT; + + // Constant buffer + public ShaderVariablesRaytracing raytracingCB; + } + + public struct AmbientOcclusionTraceResources + { + // Input Buffer + public RayTracingAccelerationStructure rayTracingAccelerationStructure; + public RTHandle depthStencilBuffer; + public RTHandle normalBuffer; + public BlueNoise.DitheredTextureSet ditheredTextureSet; + + // Debug textures + public RTHandle rayCountTexture; + + // Output Buffer + public RTHandle outputTexture; + } + + AmbientOcclusionTraceParameters PrepareAmbientOcclusionTraceParameters(HDCamera hdCamera, ShaderVariablesRaytracing raytracingCB) + { + AmbientOcclusionTraceParameters rtAOParameters = new AmbientOcclusionTraceParameters(); + var aoSettings = hdCamera.volumeStack.GetComponent(); + rtAOParameters.validRayTracing = m_RenderPipeline.GetRayTracingState(); + rtAOParameters.rayLength = aoSettings.rayLength; + rtAOParameters.sampleCount = aoSettings.sampleCount; + rtAOParameters.actualWidth = hdCamera.actualWidth; + rtAOParameters.actualHeight = hdCamera.actualHeight; + rtAOParameters.viewCount = hdCamera.viewCount; + rtAOParameters.raytracingCB = raytracingCB; + rtAOParameters.aoShaderRT = m_PipelineRayTracingResources.aoRaytracingRT; + return rtAOParameters; + } + + AmbientOcclusionTraceResources PrepareAmbientOcclusionTraceResources(HDCamera hdCamera, RTHandle outputTexture) + { + AmbientOcclusionTraceResources rtAOResources = new AmbientOcclusionTraceResources(); + rtAOResources.rayTracingAccelerationStructure = m_RenderPipeline.RequestAccelerationStructure(); + rtAOResources.depthStencilBuffer = m_RenderPipeline.sharedRTManager.GetDepthStencilBuffer(); + rtAOResources.normalBuffer = m_RenderPipeline.sharedRTManager.GetNormalBuffer(); + rtAOResources.rayCountTexture = m_RenderPipeline.GetRayCountManager().GetRayCountTexture(); + BlueNoise blueNoise = m_RenderPipeline.GetBlueNoiseManager(); + rtAOResources.ditheredTextureSet = blueNoise.DitheredTextureSet8SPP(); + rtAOResources.outputTexture = outputTexture; + return rtAOResources; + } + + // The set of parameters that are used to trace the ambient occlusion + public struct AmbientOcclusionDenoiseParameters + { + // Generic attributes + public bool validRayTracing; + public bool denoise; + public float denoiserRadius; + public float historyValidity; + + // Camera data + public int actualWidth; + public int actualHeight; + public int viewCount; + } + + public struct AmbientOcclusionDenoiseResources + { + // Temporary buffers + public RTHandle intermediateBuffer; + + // Output Buffer + public RTHandle ambientOcclusionHistory; + public RTHandle inputTexture; + public RTHandle outputTexture; + } + + AmbientOcclusionDenoiseParameters PrepareAmbientOcclusionDenoiseParameters(HDCamera hdCamera, ShaderVariablesRaytracing raytracingCB) + { + AmbientOcclusionDenoiseParameters rtAOParameters = new AmbientOcclusionDenoiseParameters(); + var aoSettings = hdCamera.volumeStack.GetComponent(); + rtAOParameters.validRayTracing = m_RenderPipeline.GetRayTracingState(); + rtAOParameters.denoise = aoSettings.denoise; + rtAOParameters.denoiserRadius = aoSettings.denoiserRadius; + rtAOParameters.historyValidity = 1.0f; +#if UNITY_HDRP_DXR_TESTS_DEFINE + if (Application.isPlaying) + rtAOParameters.historyValidity = 0.0f; + else +#endif + // We need to check if something invalidated the history buffers + rtAOParameters.historyValidity = m_RenderPipeline.ValidRayTracingHistory(hdCamera) ? 1.0f : 0.0f; + rtAOParameters.actualWidth = hdCamera.actualWidth; + rtAOParameters.actualHeight = hdCamera.actualHeight; + rtAOParameters.viewCount = hdCamera.viewCount; + return rtAOParameters; + } + + AmbientOcclusionDenoiseResources PrepareAmbientOcclusionDenoiseResources(HDCamera hdCamera, RTHandle inputTexture, RTHandle intermediateTexture, RTHandle outputTexture) + { + AmbientOcclusionDenoiseResources rtAOResources = new AmbientOcclusionDenoiseResources(); + rtAOResources.ambientOcclusionHistory = hdCamera.GetCurrentFrameRT((int)HDCameraFrameHistoryType.RaytracedAmbientOcclusion) + ?? hdCamera.AllocHistoryFrameRT((int)HDCameraFrameHistoryType.RaytracedAmbientOcclusion, AmbientOcclusionHistoryBufferAllocatorFunction, 1); + rtAOResources.inputTexture = inputTexture; + rtAOResources.intermediateBuffer = intermediateTexture; + rtAOResources.outputTexture = outputTexture; + return rtAOResources; + } + + // The set of parameters that are used to trace the ambient occlusion + public struct AmbientOcclusionComposeParameters + { + // Generic attributes + public bool validRayTracing; + public float intensity; + + // Camera data + public int actualWidth; + public int actualHeight; + public int viewCount; + + // Kernels + public int intensityKernel; + + // Shaders + public ComputeShader aoShaderCS; + } + + public struct AmbientOcclusionComposeResources + { + // Output Buffer + public RTHandle outputTexture; + } + + AmbientOcclusionComposeParameters PrepareAmbientOcclusionComposeParameters(HDCamera hdCamera, ShaderVariablesRaytracing raytracingCB) + { + AmbientOcclusionComposeParameters aoComposeParameters = new AmbientOcclusionComposeParameters(); + var aoSettings = hdCamera.volumeStack.GetComponent(); + aoComposeParameters.validRayTracing = m_RenderPipeline.GetRayTracingState(); + aoComposeParameters.intensity = aoSettings.intensity.value; + aoComposeParameters.actualWidth = hdCamera.actualWidth; + aoComposeParameters.actualHeight = hdCamera.actualHeight; + aoComposeParameters.viewCount = hdCamera.viewCount; + aoComposeParameters.aoShaderCS = m_PipelineRayTracingResources.aoRaytracingCS; + aoComposeParameters.intensityKernel = m_RTAOApplyIntensityKernel; + return aoComposeParameters; + } + + AmbientOcclusionComposeResources PrepareAmbientOcclusionComposeResources(HDCamera hdCamera, RTHandle inOutTexture) + { + AmbientOcclusionComposeResources aoComposeResources = new AmbientOcclusionComposeResources(); + aoComposeResources.outputTexture = inOutTexture; + return aoComposeResources; + } + + public void RenderRTAO(HDCamera hdCamera, CommandBuffer cmd, RTHandle outputTexture, ShaderVariablesRaytracing globalCB, ScriptableRenderContext renderContext, int frameCount) + { + AmbientOcclusionTraceParameters aoTraceParameters = PrepareAmbientOcclusionTraceParameters(hdCamera, globalCB); + AmbientOcclusionTraceResources aoTraceResources = PrepareAmbientOcclusionTraceResources(hdCamera, m_AOIntermediateBuffer0); + TraceAO(cmd, aoTraceParameters, aoTraceResources); + + AmbientOcclusionDenoiseParameters aoDenoiseParameters = PrepareAmbientOcclusionDenoiseParameters(hdCamera, globalCB); + AmbientOcclusionDenoiseResources aoDenoiserResources = PrepareAmbientOcclusionDenoiseResources(hdCamera, m_AOIntermediateBuffer0, m_AOIntermediateBuffer1, outputTexture); + DenoiseAO(cmd, hdCamera, aoDenoiseParameters, aoDenoiserResources); + + AmbientOcclusionComposeParameters aoComposeParameters = PrepareAmbientOcclusionComposeParameters(hdCamera, globalCB); + AmbientOcclusionComposeResources aoComposeResources = PrepareAmbientOcclusionComposeResources(hdCamera, outputTexture); + ComposeAO(cmd, hdCamera, aoComposeParameters, aoComposeResources); + } + + static public void TraceAO(CommandBuffer cmd, AmbientOcclusionTraceParameters aoTraceParameters, AmbientOcclusionTraceResources aoTraceResources) { // If any of the previous requirements is missing, the effect is not requested or no acceleration structure, set the default one and leave right away - if (!m_RenderPipeline.GetRayTracingState()) + if (!aoTraceParameters.validRayTracing) { SetDefaultAmbientOcclusionTexture(cmd); return; } - RayTracingShader aoShaderRT = m_PipelineRayTracingResources.aoRaytracingRT; - var aoSettings = hdCamera.volumeStack.GetComponent(); - RayCountManager rayCountManager = m_RenderPipeline.GetRayCountManager(); - using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.RaytracingAmbientOcclusion))) { - // Grab the acceleration structure for the target camera - RayTracingAccelerationStructure accelerationStructure = m_RenderPipeline.RequestAccelerationStructure(); - // Define the shader pass to use for the reflection pass - cmd.SetRayTracingShaderPass(aoShaderRT, "VisibilityDXR"); + cmd.SetRayTracingShaderPass(aoTraceParameters.aoShaderRT, "VisibilityDXR"); // Set the acceleration structure for the pass - cmd.SetRayTracingAccelerationStructure(aoShaderRT, HDShaderIDs._RaytracingAccelerationStructureName, accelerationStructure); + cmd.SetRayTracingAccelerationStructure(aoTraceParameters.aoShaderRT, HDShaderIDs._RaytracingAccelerationStructureName, aoTraceResources.rayTracingAccelerationStructure); // Inject the ray generation data (be careful of the global constant buffer limitation) - globalCB._RaytracingRayMaxLength = aoSettings.rayLength; - globalCB._RaytracingNumSamples = aoSettings.sampleCount; - ConstantBuffer.PushGlobal(cmd, globalCB, HDShaderIDs._ShaderVariablesRaytracing); + aoTraceParameters.raytracingCB._RaytracingRayMaxLength = aoTraceParameters.rayLength; + aoTraceParameters.raytracingCB._RaytracingNumSamples = aoTraceParameters.sampleCount; + ConstantBuffer.PushGlobal(cmd, aoTraceParameters.raytracingCB, HDShaderIDs._ShaderVariablesRaytracing); // Set the data for the ray generation - cmd.SetRayTracingTextureParam(aoShaderRT, HDShaderIDs._DepthTexture, m_RenderPipeline.sharedRTManager.GetDepthStencilBuffer()); - cmd.SetRayTracingTextureParam(aoShaderRT, HDShaderIDs._NormalBufferTexture, m_RenderPipeline.sharedRTManager.GetNormalBuffer()); + cmd.SetRayTracingTextureParam(aoTraceParameters.aoShaderRT, HDShaderIDs._DepthTexture, aoTraceResources.depthStencilBuffer); + cmd.SetRayTracingTextureParam(aoTraceParameters.aoShaderRT, HDShaderIDs._NormalBufferTexture, aoTraceResources.normalBuffer); // Inject the ray-tracing sampling data - BlueNoise blueNoise = m_RenderPipeline.GetBlueNoiseManager(); - blueNoise.BindDitheredRNGData8SPP(cmd); - + BlueNoise.BindDitheredTextureSet(cmd, aoTraceResources.ditheredTextureSet); // Set the output textures - cmd.SetRayTracingTextureParam(aoShaderRT, HDShaderIDs._RayCountTexture, rayCountManager.GetRayCountTexture()); - cmd.SetRayTracingTextureParam(aoShaderRT, HDShaderIDs._AmbientOcclusionTextureRW, m_AOIntermediateBuffer0); + cmd.SetRayTracingTextureParam(aoTraceParameters.aoShaderRT, HDShaderIDs._RayCountTexture, aoTraceResources.rayCountTexture); + cmd.SetRayTracingTextureParam(aoTraceParameters.aoShaderRT, HDShaderIDs._AmbientOcclusionTextureRW, aoTraceResources.outputTexture); // Run the computation - cmd.DispatchRays(aoShaderRT, m_RayGenShaderName, (uint)hdCamera.actualWidth, (uint)hdCamera.actualHeight, (uint)hdCamera.viewCount); + cmd.DispatchRays(aoTraceParameters.aoShaderRT, m_RayGenShaderName, (uint)aoTraceParameters.actualWidth, (uint)aoTraceParameters.actualHeight, (uint)aoTraceParameters.viewCount); } + } + + public void DenoiseAO(CommandBuffer cmd, HDCamera hdCamera, AmbientOcclusionDenoiseParameters aoDenoiseParameters, AmbientOcclusionDenoiseResources aoDenoiseResources) + { + // If the ray tracing state is invalid, we should be doing anything + if (!aoDenoiseParameters.validRayTracing) + return; using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.RaytracingFilterAmbientOcclusion))) { - if(aoSettings.denoise) + if (aoDenoiseParameters.denoise) { - // Grab the history buffer - RTHandle ambientOcclusionHistory = hdCamera.GetCurrentFrameRT((int)HDCameraFrameHistoryType.RaytracedAmbientOcclusion) - ?? hdCamera.AllocHistoryFrameRT((int)HDCameraFrameHistoryType.RaytracedAmbientOcclusion, AmbientOcclusionHistoryBufferAllocatorFunction, 1); - - float historyValidity = 1.0f; - #if UNITY_HDRP_DXR_TESTS_DEFINE - if (Application.isPlaying) - historyValidity = 0.0f; - else - #endif - // We need to check if something invalidated the history buffers - historyValidity = m_RenderPipeline.ValidRayTracingHistory(hdCamera) ? 1.0f : 0.0f; - // Apply the temporal denoiser HDTemporalFilter temporalFilter = m_RenderPipeline.GetTemporalFilter(); - temporalFilter.DenoiseBuffer(cmd, hdCamera, m_AOIntermediateBuffer0, ambientOcclusionHistory, m_AOIntermediateBuffer1, historyValidity: historyValidity); + temporalFilter.DenoiseBuffer(cmd, hdCamera, aoDenoiseResources.inputTexture, aoDenoiseResources.ambientOcclusionHistory, aoDenoiseResources.intermediateBuffer, historyValidity: aoDenoiseParameters.historyValidity); // Apply the diffuse denoiser HDDiffuseDenoiser diffuseDenoiser = m_RenderPipeline.GetDiffuseDenoiser(); - diffuseDenoiser.DenoiseBuffer(cmd, hdCamera, m_AOIntermediateBuffer1, outputTexture, aoSettings.denoiserRadius); + diffuseDenoiser.DenoiseBuffer(cmd, hdCamera, aoDenoiseResources.intermediateBuffer, aoDenoiseResources.outputTexture, aoDenoiseParameters.denoiserRadius); } else { - HDUtils.BlitCameraTexture(cmd, m_AOIntermediateBuffer0, outputTexture); + HDUtils.BlitCameraTexture(cmd, aoDenoiseResources.inputTexture, aoDenoiseResources.outputTexture); } + } + } - ComputeShader aoShaderCS = m_PipelineRayTracingResources.aoRaytracingCS; - cmd.SetComputeFloatParam(aoShaderCS, HDShaderIDs._RaytracingAOIntensity, aoSettings.intensity.value); - cmd.SetComputeTextureParam(aoShaderCS, m_RTAOApplyIntensityKernel, HDShaderIDs._AmbientOcclusionTextureRW, outputTexture); - int texWidth = hdCamera.actualWidth; - int texHeight = hdCamera.actualHeight; + static public void ComposeAO(CommandBuffer cmd, HDCamera hdCamera, AmbientOcclusionComposeParameters aoComposeParameters, AmbientOcclusionComposeResources aoComposeResources) + { + // If the ray tracing state is invalid, we should be doing anything + if (!aoComposeParameters.validRayTracing) + return; + + using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.RaytracingComposeAmbientOcclusion))) + { + cmd.SetComputeFloatParam(aoComposeParameters.aoShaderCS, HDShaderIDs._RaytracingAOIntensity, aoComposeParameters.intensity); + cmd.SetComputeTextureParam(aoComposeParameters.aoShaderCS, aoComposeParameters.intensityKernel, HDShaderIDs._AmbientOcclusionTextureRW, aoComposeResources.outputTexture); + int texWidth = aoComposeParameters.actualWidth; + int texHeight = aoComposeParameters.actualHeight; int areaTileSize = 8; int numTilesXHR = (texWidth + (areaTileSize - 1)) / areaTileSize; int numTilesYHR = (texHeight + (areaTileSize - 1)) / areaTileSize; - cmd.DispatchCompute(aoShaderCS, m_RTAOApplyIntensityKernel, numTilesXHR, numTilesYHR, hdCamera.viewCount); + cmd.DispatchCompute(aoComposeParameters.aoShaderCS, aoComposeParameters.intensityKernel, numTilesXHR, numTilesYHR, aoComposeParameters.viewCount); } // Bind the textures and the params - cmd.SetGlobalTexture(HDShaderIDs._AmbientOcclusionTexture, outputTexture); + cmd.SetGlobalTexture(HDShaderIDs._AmbientOcclusionTexture, aoComposeResources.outputTexture); // TODO: All the push-debug stuff should be centralized somewhere - (RenderPipelineManager.currentPipeline as HDRenderPipeline).PushFullScreenDebugTexture(hdCamera, cmd, outputTexture, FullScreenDebugMode.ScreenSpaceAmbientOcclusion); + (RenderPipelineManager.currentPipeline as HDRenderPipeline).PushFullScreenDebugTexture(hdCamera, cmd, aoComposeResources.outputTexture, FullScreenDebugMode.ScreenSpaceAmbientOcclusion); } } } diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Utility/BlueNoise.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Utility/BlueNoise.cs index 5567db564fa..d2a3f18450a 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Utility/BlueNoise.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Utility/BlueNoise.cs @@ -106,6 +106,15 @@ static void InitTextures(int size, TextureFormat format, Texture2D[] sourceTextu } } + // Structure that holds all the dithered sampling texture that shall be binded at dispatch time. + public struct DitheredTextureSet + { + public Texture2D owenScrambled256Tex; + public Texture2D scramblingTile; + public Texture2D rankingTile; + public Texture2D scramblingTex; + } + internal void BindDitheredRNGData1SPP(CommandBuffer cmd) { cmd.SetGlobalTexture(HDShaderIDs._OwenScrambledTexture, m_RenderPipelineResources.textures.owenScrambled256Tex); @@ -122,6 +131,17 @@ internal void BindDitheredRNGData8SPP(CommandBuffer cmd) cmd.SetGlobalTexture(HDShaderIDs._ScramblingTexture, m_RenderPipelineResources.textures.scramblingTex); } + internal DitheredTextureSet DitheredTextureSet8SPP() + { + // This is a structure, so the new shouldn't be a problem. + DitheredTextureSet ditheredTextureSet = new DitheredTextureSet(); + ditheredTextureSet.owenScrambled256Tex = m_RenderPipelineResources.textures.owenScrambled256Tex; + ditheredTextureSet.scramblingTile = m_RenderPipelineResources.textures.scramblingTile8SPP; + ditheredTextureSet.rankingTile = m_RenderPipelineResources.textures.rankingTile8SPP; + ditheredTextureSet.scramblingTex = m_RenderPipelineResources.textures.scramblingTex; + return ditheredTextureSet; + } + internal void BindDitheredRNGData256SPP(CommandBuffer cmd) { cmd.SetGlobalTexture(HDShaderIDs._OwenScrambledTexture, m_RenderPipelineResources.textures.owenScrambled256Tex); @@ -129,5 +149,13 @@ internal void BindDitheredRNGData256SPP(CommandBuffer cmd) cmd.SetGlobalTexture(HDShaderIDs._RankingTileXSPP, m_RenderPipelineResources.textures.rankingTile256SPP); cmd.SetGlobalTexture(HDShaderIDs._ScramblingTexture, m_RenderPipelineResources.textures.scramblingTex); } + + internal static void BindDitheredTextureSet(CommandBuffer cmd, DitheredTextureSet ditheredTextureSet) + { + cmd.SetGlobalTexture(HDShaderIDs._OwenScrambledTexture, ditheredTextureSet.owenScrambled256Tex); + cmd.SetGlobalTexture(HDShaderIDs._ScramblingTileXSPP, ditheredTextureSet.scramblingTile); + cmd.SetGlobalTexture(HDShaderIDs._RankingTileXSPP, ditheredTextureSet.rankingTile); + cmd.SetGlobalTexture(HDShaderIDs._ScramblingTexture, ditheredTextureSet.scramblingTex); + } } } From 5fea24fd658df15edd74dce1f876adf270cd76a8 Mon Sep 17 00:00:00 2001 From: Anis Date: Fri, 10 Jul 2020 15:05:03 +0200 Subject: [PATCH 2/2] Review corrections --- .../HDRaytracingAmbientOcclusion.cs | 145 +++++++----------- 1 file changed, 58 insertions(+), 87 deletions(-) diff --git a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/HDRaytracingAmbientOcclusion.cs b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/HDRaytracingAmbientOcclusion.cs index 2903011886c..410d9adf598 100644 --- a/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/HDRaytracingAmbientOcclusion.cs +++ b/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/Raytracing/HDRaytracingAmbientOcclusion.cs @@ -63,7 +63,6 @@ static public void SetDefaultAmbientOcclusionTexture(CommandBuffer cmd) public struct AmbientOcclusionTraceParameters { // Generic attributes - public bool validRayTracing; public float rayLength; public int sampleCount; @@ -98,7 +97,6 @@ AmbientOcclusionTraceParameters PrepareAmbientOcclusionTraceParameters(HDCamera { AmbientOcclusionTraceParameters rtAOParameters = new AmbientOcclusionTraceParameters(); var aoSettings = hdCamera.volumeStack.GetComponent(); - rtAOParameters.validRayTracing = m_RenderPipeline.GetRayTracingState(); rtAOParameters.rayLength = aoSettings.rayLength; rtAOParameters.sampleCount = aoSettings.sampleCount; rtAOParameters.actualWidth = hdCamera.actualWidth; @@ -126,7 +124,6 @@ AmbientOcclusionTraceResources PrepareAmbientOcclusionTraceResources(HDCamera hd public struct AmbientOcclusionDenoiseParameters { // Generic attributes - public bool validRayTracing; public bool denoise; public float denoiserRadius; public float historyValidity; @@ -152,7 +149,6 @@ AmbientOcclusionDenoiseParameters PrepareAmbientOcclusionDenoiseParameters(HDCam { AmbientOcclusionDenoiseParameters rtAOParameters = new AmbientOcclusionDenoiseParameters(); var aoSettings = hdCamera.volumeStack.GetComponent(); - rtAOParameters.validRayTracing = m_RenderPipeline.GetRayTracingState(); rtAOParameters.denoise = aoSettings.denoise; rtAOParameters.denoiserRadius = aoSettings.denoiserRadius; rtAOParameters.historyValidity = 1.0f; @@ -184,7 +180,6 @@ AmbientOcclusionDenoiseResources PrepareAmbientOcclusionDenoiseResources(HDCamer public struct AmbientOcclusionComposeParameters { // Generic attributes - public bool validRayTracing; public float intensity; // Camera data @@ -199,17 +194,10 @@ public struct AmbientOcclusionComposeParameters public ComputeShader aoShaderCS; } - public struct AmbientOcclusionComposeResources - { - // Output Buffer - public RTHandle outputTexture; - } - AmbientOcclusionComposeParameters PrepareAmbientOcclusionComposeParameters(HDCamera hdCamera, ShaderVariablesRaytracing raytracingCB) { AmbientOcclusionComposeParameters aoComposeParameters = new AmbientOcclusionComposeParameters(); var aoSettings = hdCamera.volumeStack.GetComponent(); - aoComposeParameters.validRayTracing = m_RenderPipeline.GetRayTracingState(); aoComposeParameters.intensity = aoSettings.intensity.value; aoComposeParameters.actualWidth = hdCamera.actualWidth; aoComposeParameters.actualHeight = hdCamera.actualHeight; @@ -219,114 +207,97 @@ AmbientOcclusionComposeParameters PrepareAmbientOcclusionComposeParameters(HDCam return aoComposeParameters; } - AmbientOcclusionComposeResources PrepareAmbientOcclusionComposeResources(HDCamera hdCamera, RTHandle inOutTexture) - { - AmbientOcclusionComposeResources aoComposeResources = new AmbientOcclusionComposeResources(); - aoComposeResources.outputTexture = inOutTexture; - return aoComposeResources; - } - public void RenderRTAO(HDCamera hdCamera, CommandBuffer cmd, RTHandle outputTexture, ShaderVariablesRaytracing globalCB, ScriptableRenderContext renderContext, int frameCount) { + if (!m_RenderPipeline.GetRayTracingState()) + { + SetDefaultAmbientOcclusionTexture(cmd); + return; + } AmbientOcclusionTraceParameters aoTraceParameters = PrepareAmbientOcclusionTraceParameters(hdCamera, globalCB); AmbientOcclusionTraceResources aoTraceResources = PrepareAmbientOcclusionTraceResources(hdCamera, m_AOIntermediateBuffer0); - TraceAO(cmd, aoTraceParameters, aoTraceResources); + // If any of the previous requirements is missing, the effect is not requested or no acceleration structure, set the default one and leave right away + using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.RaytracingAmbientOcclusion))) + { + TraceAO(cmd, aoTraceParameters, aoTraceResources); + } AmbientOcclusionDenoiseParameters aoDenoiseParameters = PrepareAmbientOcclusionDenoiseParameters(hdCamera, globalCB); AmbientOcclusionDenoiseResources aoDenoiserResources = PrepareAmbientOcclusionDenoiseResources(hdCamera, m_AOIntermediateBuffer0, m_AOIntermediateBuffer1, outputTexture); - DenoiseAO(cmd, hdCamera, aoDenoiseParameters, aoDenoiserResources); + using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.RaytracingFilterAmbientOcclusion))) + { + DenoiseAO(cmd, hdCamera, aoDenoiseParameters, aoDenoiserResources); + } AmbientOcclusionComposeParameters aoComposeParameters = PrepareAmbientOcclusionComposeParameters(hdCamera, globalCB); - AmbientOcclusionComposeResources aoComposeResources = PrepareAmbientOcclusionComposeResources(hdCamera, outputTexture); - ComposeAO(cmd, hdCamera, aoComposeParameters, aoComposeResources); + using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.RaytracingComposeAmbientOcclusion))) + { + ComposeAO(cmd, hdCamera, aoComposeParameters, outputTexture); + } } static public void TraceAO(CommandBuffer cmd, AmbientOcclusionTraceParameters aoTraceParameters, AmbientOcclusionTraceResources aoTraceResources) { - // If any of the previous requirements is missing, the effect is not requested or no acceleration structure, set the default one and leave right away - if (!aoTraceParameters.validRayTracing) - { - SetDefaultAmbientOcclusionTexture(cmd); - return; - } + // Define the shader pass to use for the reflection pass + cmd.SetRayTracingShaderPass(aoTraceParameters.aoShaderRT, "VisibilityDXR"); - using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.RaytracingAmbientOcclusion))) - { - // Define the shader pass to use for the reflection pass - cmd.SetRayTracingShaderPass(aoTraceParameters.aoShaderRT, "VisibilityDXR"); + // Set the acceleration structure for the pass + cmd.SetRayTracingAccelerationStructure(aoTraceParameters.aoShaderRT, HDShaderIDs._RaytracingAccelerationStructureName, aoTraceResources.rayTracingAccelerationStructure); - // Set the acceleration structure for the pass - cmd.SetRayTracingAccelerationStructure(aoTraceParameters.aoShaderRT, HDShaderIDs._RaytracingAccelerationStructureName, aoTraceResources.rayTracingAccelerationStructure); + // Inject the ray generation data (be careful of the global constant buffer limitation) + aoTraceParameters.raytracingCB._RaytracingRayMaxLength = aoTraceParameters.rayLength; + aoTraceParameters.raytracingCB._RaytracingNumSamples = aoTraceParameters.sampleCount; + ConstantBuffer.PushGlobal(cmd, aoTraceParameters.raytracingCB, HDShaderIDs._ShaderVariablesRaytracing); - // Inject the ray generation data (be careful of the global constant buffer limitation) - aoTraceParameters.raytracingCB._RaytracingRayMaxLength = aoTraceParameters.rayLength; - aoTraceParameters.raytracingCB._RaytracingNumSamples = aoTraceParameters.sampleCount; - ConstantBuffer.PushGlobal(cmd, aoTraceParameters.raytracingCB, HDShaderIDs._ShaderVariablesRaytracing); + // Set the data for the ray generation + cmd.SetRayTracingTextureParam(aoTraceParameters.aoShaderRT, HDShaderIDs._DepthTexture, aoTraceResources.depthStencilBuffer); + cmd.SetRayTracingTextureParam(aoTraceParameters.aoShaderRT, HDShaderIDs._NormalBufferTexture, aoTraceResources.normalBuffer); - // Set the data for the ray generation - cmd.SetRayTracingTextureParam(aoTraceParameters.aoShaderRT, HDShaderIDs._DepthTexture, aoTraceResources.depthStencilBuffer); - cmd.SetRayTracingTextureParam(aoTraceParameters.aoShaderRT, HDShaderIDs._NormalBufferTexture, aoTraceResources.normalBuffer); + // Inject the ray-tracing sampling data + BlueNoise.BindDitheredTextureSet(cmd, aoTraceResources.ditheredTextureSet); - // Inject the ray-tracing sampling data - BlueNoise.BindDitheredTextureSet(cmd, aoTraceResources.ditheredTextureSet); + // Set the output textures + cmd.SetRayTracingTextureParam(aoTraceParameters.aoShaderRT, HDShaderIDs._RayCountTexture, aoTraceResources.rayCountTexture); + cmd.SetRayTracingTextureParam(aoTraceParameters.aoShaderRT, HDShaderIDs._AmbientOcclusionTextureRW, aoTraceResources.outputTexture); - // Set the output textures - cmd.SetRayTracingTextureParam(aoTraceParameters.aoShaderRT, HDShaderIDs._RayCountTexture, aoTraceResources.rayCountTexture); - cmd.SetRayTracingTextureParam(aoTraceParameters.aoShaderRT, HDShaderIDs._AmbientOcclusionTextureRW, aoTraceResources.outputTexture); - - // Run the computation - cmd.DispatchRays(aoTraceParameters.aoShaderRT, m_RayGenShaderName, (uint)aoTraceParameters.actualWidth, (uint)aoTraceParameters.actualHeight, (uint)aoTraceParameters.viewCount); - } + // Run the computation + cmd.DispatchRays(aoTraceParameters.aoShaderRT, m_RayGenShaderName, (uint)aoTraceParameters.actualWidth, (uint)aoTraceParameters.actualHeight, (uint)aoTraceParameters.viewCount); } public void DenoiseAO(CommandBuffer cmd, HDCamera hdCamera, AmbientOcclusionDenoiseParameters aoDenoiseParameters, AmbientOcclusionDenoiseResources aoDenoiseResources) { - // If the ray tracing state is invalid, we should be doing anything - if (!aoDenoiseParameters.validRayTracing) - return; + if (aoDenoiseParameters.denoise) + { + // Apply the temporal denoiser + HDTemporalFilter temporalFilter = m_RenderPipeline.GetTemporalFilter(); + temporalFilter.DenoiseBuffer(cmd, hdCamera, aoDenoiseResources.inputTexture, aoDenoiseResources.ambientOcclusionHistory, aoDenoiseResources.intermediateBuffer, historyValidity: aoDenoiseParameters.historyValidity); - using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.RaytracingFilterAmbientOcclusion))) + // Apply the diffuse denoiser + HDDiffuseDenoiser diffuseDenoiser = m_RenderPipeline.GetDiffuseDenoiser(); + diffuseDenoiser.DenoiseBuffer(cmd, hdCamera, aoDenoiseResources.intermediateBuffer, aoDenoiseResources.outputTexture, aoDenoiseParameters.denoiserRadius); + } + else { - if (aoDenoiseParameters.denoise) - { - // Apply the temporal denoiser - HDTemporalFilter temporalFilter = m_RenderPipeline.GetTemporalFilter(); - temporalFilter.DenoiseBuffer(cmd, hdCamera, aoDenoiseResources.inputTexture, aoDenoiseResources.ambientOcclusionHistory, aoDenoiseResources.intermediateBuffer, historyValidity: aoDenoiseParameters.historyValidity); - - // Apply the diffuse denoiser - HDDiffuseDenoiser diffuseDenoiser = m_RenderPipeline.GetDiffuseDenoiser(); - diffuseDenoiser.DenoiseBuffer(cmd, hdCamera, aoDenoiseResources.intermediateBuffer, aoDenoiseResources.outputTexture, aoDenoiseParameters.denoiserRadius); - } - else - { - HDUtils.BlitCameraTexture(cmd, aoDenoiseResources.inputTexture, aoDenoiseResources.outputTexture); - } + HDUtils.BlitCameraTexture(cmd, aoDenoiseResources.inputTexture, aoDenoiseResources.outputTexture); } } - static public void ComposeAO(CommandBuffer cmd, HDCamera hdCamera, AmbientOcclusionComposeParameters aoComposeParameters, AmbientOcclusionComposeResources aoComposeResources) + static public void ComposeAO(CommandBuffer cmd, HDCamera hdCamera, AmbientOcclusionComposeParameters aoComposeParameters, RTHandle outputTexture) { - // If the ray tracing state is invalid, we should be doing anything - if (!aoComposeParameters.validRayTracing) - return; - - using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.RaytracingComposeAmbientOcclusion))) - { - cmd.SetComputeFloatParam(aoComposeParameters.aoShaderCS, HDShaderIDs._RaytracingAOIntensity, aoComposeParameters.intensity); - cmd.SetComputeTextureParam(aoComposeParameters.aoShaderCS, aoComposeParameters.intensityKernel, HDShaderIDs._AmbientOcclusionTextureRW, aoComposeResources.outputTexture); - int texWidth = aoComposeParameters.actualWidth; - int texHeight = aoComposeParameters.actualHeight; - int areaTileSize = 8; - int numTilesXHR = (texWidth + (areaTileSize - 1)) / areaTileSize; - int numTilesYHR = (texHeight + (areaTileSize - 1)) / areaTileSize; - cmd.DispatchCompute(aoComposeParameters.aoShaderCS, aoComposeParameters.intensityKernel, numTilesXHR, numTilesYHR, aoComposeParameters.viewCount); - } + cmd.SetComputeFloatParam(aoComposeParameters.aoShaderCS, HDShaderIDs._RaytracingAOIntensity, aoComposeParameters.intensity); + cmd.SetComputeTextureParam(aoComposeParameters.aoShaderCS, aoComposeParameters.intensityKernel, HDShaderIDs._AmbientOcclusionTextureRW, outputTexture); + int texWidth = aoComposeParameters.actualWidth; + int texHeight = aoComposeParameters.actualHeight; + int areaTileSize = 8; + int numTilesXHR = (texWidth + (areaTileSize - 1)) / areaTileSize; + int numTilesYHR = (texHeight + (areaTileSize - 1)) / areaTileSize; + cmd.DispatchCompute(aoComposeParameters.aoShaderCS, aoComposeParameters.intensityKernel, numTilesXHR, numTilesYHR, aoComposeParameters.viewCount); // Bind the textures and the params - cmd.SetGlobalTexture(HDShaderIDs._AmbientOcclusionTexture, aoComposeResources.outputTexture); + cmd.SetGlobalTexture(HDShaderIDs._AmbientOcclusionTexture, outputTexture); // TODO: All the push-debug stuff should be centralized somewhere - (RenderPipelineManager.currentPipeline as HDRenderPipeline).PushFullScreenDebugTexture(hdCamera, cmd, aoComposeResources.outputTexture, FullScreenDebugMode.ScreenSpaceAmbientOcclusion); + (RenderPipelineManager.currentPipeline as HDRenderPipeline).PushFullScreenDebugTexture(hdCamera, cmd, outputTexture, FullScreenDebugMode.ScreenSpaceAmbientOcclusion); } } }