SSSAreaRayTraceParameters PrepareSSSAreaRayTraceParameters(HDCamera hdCamera, HDAdditionalLightData additionalLightData, LightData lightData, int lightIndex)
        {
            SSSAreaRayTraceParameters sssartParams = new SSSAreaRayTraceParameters();

            // Set the camera parameters
            sssartParams.texWidth  = hdCamera.actualWidth;
            sssartParams.texHeight = hdCamera.actualHeight;
            sssartParams.viewCount = hdCamera.viewCount;

            // Evaluation parameters
            sssartParams.numSamples = additionalLightData.numRayTracingSamples;
            sssartParams.lightIndex = lightIndex;
            // We need to build the world to area light matrix
            sssartParams.worldToLocalMatrix.SetColumn(0, lightData.right);
            sssartParams.worldToLocalMatrix.SetColumn(1, lightData.up);
            sssartParams.worldToLocalMatrix.SetColumn(2, lightData.forward);
            // Compensate the  relative rendering if active
            Vector3 lightPositionWS = lightData.positionRWS;

            if (ShaderConfig.s_CameraRelativeRendering != 0)
            {
                lightPositionWS += hdCamera.camera.transform.position;
            }
            sssartParams.worldToLocalMatrix.SetColumn(3, lightPositionWS);
            sssartParams.worldToLocalMatrix.m33 = 1.0f;
            sssartParams.worldToLocalMatrix     = m_WorldToLocalArea.inverse;
            sssartParams.historyValidity        = EvaluateHistoryValidity(hdCamera);
            sssartParams.filterTracedShadow     = additionalLightData.filterTracedShadow;
            sssartParams.areaShadowSlot         = m_lightList.lights[lightIndex].screenSpaceShadowIndex;
            sssartParams.filterSize             = additionalLightData.filterSizeTraced;

            // Kernels
            sssartParams.areaRaytracingShadowPrepassKernel   = m_AreaRaytracingShadowPrepassKernel;
            sssartParams.areaRaytracingShadowNewSampleKernel = m_AreaRaytracingShadowNewSampleKernel;
            sssartParams.areaShadowApplyTAAKernel            = m_AreaShadowApplyTAAKernel;
            sssartParams.areaUpdateAnalyticHistoryKernel     = m_AreaUpdateAnalyticHistoryKernel;
            sssartParams.areaUpdateShadowHistoryKernel       = m_AreaUpdateShadowHistoryKernel;
            sssartParams.areaEstimateNoiseKernel             = m_AreaEstimateNoiseKernel;
            sssartParams.areaFirstDenoiseKernel    = m_AreaFirstDenoiseKernel;
            sssartParams.areaSecondDenoiseKernel   = m_AreaSecondDenoiseKernel;
            sssartParams.areaShadowNoDenoiseKernel = m_AreaShadowNoDenoiseKernel;

            // Other parameters
            // Grab the acceleration structure for the target camera
            sssartParams.accelerationStructure       = RequestAccelerationStructure();
            sssartParams.shaderVariablesRayTracingCB = m_ShaderVariablesRayTracingCB;
            sssartParams.screenSpaceShadowsCS        = m_ScreenSpaceShadowsCS;
            sssartParams.screenSpaceShadowsRT        = m_ScreenSpaceShadowsRT;
            sssartParams.screenSpaceShadowsFilterCS  = m_ScreenSpaceShadowsFilterCS;
            sssartParams.scramblingTex = m_Asset.renderPipelineResources.textures.scramblingTex;
            BlueNoise blueNoise = GetBlueNoiseManager();

            sssartParams.ditheredTextureSet = blueNoise.DitheredTextureSet8SPP();

            return(sssartParams);
        }
        static void ExecuteSSSAreaRayTrace(CommandBuffer cmd, SSSAreaRayTraceParameters sssartParams, SSSAreaRayTraceResources sssartResources)
        {
            // Inject the ray-tracing sampling data
            BlueNoise.BindDitheredTextureSet(cmd, sssartParams.ditheredTextureSet);

            // Evaluate the dispatch parameters
            int areaTileSize = 8;
            int numTilesX    = (sssartParams.texWidth + (areaTileSize - 1)) / areaTileSize;
            int numTilesY    = (sssartParams.texHeight + (areaTileSize - 1)) / areaTileSize;

            // We have noticed from extensive profiling that ray-trace shaders are not as effective for running per-pixel computation. In order to reduce that,
            // we do a first prepass that compute the analytic term and probability and generates the first integration sample

            // Bind the light data
            cmd.SetComputeBufferParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowPrepassKernel, HDShaderIDs._LightDatas, sssartResources.lightData);
            cmd.SetComputeMatrixParam(sssartParams.screenSpaceShadowsCS, HDShaderIDs._RaytracingAreaWorldToLocal, sssartParams.worldToLocalMatrix);
            cmd.SetComputeIntParam(sssartParams.screenSpaceShadowsCS, HDShaderIDs._RaytracingTargetAreaLight, sssartParams.lightIndex);

            sssartParams.shaderVariablesRayTracingCB._RaytracingNumSamples = sssartParams.numSamples;
            ConstantBuffer.PushGlobal(cmd, sssartParams.shaderVariablesRayTracingCB, HDShaderIDs._ShaderVariablesRaytracing);

            // Bind the input buffers
            cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowPrepassKernel, HDShaderIDs._DepthTexture, sssartResources.depthStencilBuffer);
            cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowPrepassKernel, HDShaderIDs._NormalBufferTexture, sssartResources.normalBuffer);
            cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowPrepassKernel, HDShaderIDs._GBufferTexture[0], sssartResources.gbuffer0);
            cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowPrepassKernel, HDShaderIDs._GBufferTexture[1], sssartResources.gbuffer1);
            cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowPrepassKernel, HDShaderIDs._GBufferTexture[2], sssartResources.gbuffer2);
            cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowPrepassKernel, HDShaderIDs._GBufferTexture[3], sssartResources.gbuffer3);
            cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowPrepassKernel, HDShaderIDs._CookieAtlas, sssartResources.cookieAtlasTexture);
            cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowPrepassKernel, HDShaderIDs._StencilTexture, sssartResources.depthStencilBuffer, 0, RenderTextureSubElement.Stencil);

            // Bind the output buffers
            cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowPrepassKernel, HDShaderIDs._RaytracedAreaShadowIntegration, sssartResources.intermediateBufferRGBA0);
            cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowPrepassKernel, HDShaderIDs._RaytracedAreaShadowSample, sssartResources.intermediateBufferRGBA1);
            cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowPrepassKernel, HDShaderIDs._RaytracingDirectionBuffer, sssartResources.directionBuffer);
            cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowPrepassKernel, HDShaderIDs._RayTracingLengthBuffer, sssartResources.rayLengthBuffer);
            cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowPrepassKernel, HDShaderIDs._AnalyticProbBuffer, sssartResources.intermediateBufferRG0);
            cmd.DispatchCompute(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowPrepassKernel, numTilesX, numTilesY, sssartParams.viewCount);

            // Set ray count texture
            cmd.SetRayTracingTextureParam(sssartParams.screenSpaceShadowsRT, HDShaderIDs._RayCountTexture, sssartResources.rayCountTexture);

            // Set the acceleration structure for the pass
            cmd.SetRayTracingAccelerationStructure(sssartParams.screenSpaceShadowsRT, HDShaderIDs._RaytracingAccelerationStructureName, sssartParams.accelerationStructure);

            // Define the shader pass to use for the reflection pass
            cmd.SetRayTracingShaderPass(sssartParams.screenSpaceShadowsRT, "VisibilityDXR");

            // Input data
            cmd.SetRayTracingBufferParam(sssartParams.screenSpaceShadowsRT, HDShaderIDs._LightDatas, sssartResources.lightData);
            cmd.SetRayTracingTextureParam(sssartParams.screenSpaceShadowsRT, HDShaderIDs._DepthTexture, sssartResources.depthStencilBuffer);
            cmd.SetRayTracingTextureParam(sssartParams.screenSpaceShadowsRT, HDShaderIDs._NormalBufferTexture, sssartResources.normalBuffer);
            cmd.SetRayTracingTextureParam(sssartParams.screenSpaceShadowsRT, HDShaderIDs._AnalyticProbBuffer, sssartResources.intermediateBufferRG0);
            cmd.SetRayTracingTextureParam(sssartParams.screenSpaceShadowsRT, HDShaderIDs._RaytracedAreaShadowSample, sssartResources.intermediateBufferRGBA1);
            cmd.SetRayTracingTextureParam(sssartParams.screenSpaceShadowsRT, HDShaderIDs._RaytracingDirectionBuffer, sssartResources.directionBuffer);
            cmd.SetRayTracingTextureParam(sssartParams.screenSpaceShadowsRT, HDShaderIDs._RayTracingLengthBuffer, sssartResources.rayLengthBuffer);
            cmd.SetRayTracingIntParam(sssartParams.screenSpaceShadowsRT, HDShaderIDs._RaytracingTargetAreaLight, sssartParams.lightIndex);

            // Output data
            cmd.SetRayTracingTextureParam(sssartParams.screenSpaceShadowsRT, HDShaderIDs._RaytracedAreaShadowIntegration, sssartResources.intermediateBufferRGBA0);

            // Evaluate the intersection
            cmd.DispatchRays(sssartParams.screenSpaceShadowsRT, m_RayGenAreaShadowSingleName, (uint)sssartParams.texWidth, (uint)sssartParams.texHeight, (uint)sssartParams.viewCount);

            // Let's do the following samples (if any)
            for (int sampleIndex = 1; sampleIndex < sssartParams.numSamples; ++sampleIndex)
            {
                // Update global Constant Buffer
                sssartParams.shaderVariablesRayTracingCB._RaytracingNumSamples  = sssartParams.numSamples;
                sssartParams.shaderVariablesRayTracingCB._RaytracingSampleIndex = sampleIndex;
                ConstantBuffer.PushGlobal(cmd, sssartParams.shaderVariablesRayTracingCB, HDShaderIDs._ShaderVariablesRaytracing);

                // Bind the light data
                cmd.SetComputeBufferParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowNewSampleKernel, HDShaderIDs._LightDatas, sssartResources.lightData);
                cmd.SetComputeIntParam(sssartParams.screenSpaceShadowsCS, HDShaderIDs._RaytracingTargetAreaLight, sssartParams.lightIndex);
                cmd.SetComputeMatrixParam(sssartParams.screenSpaceShadowsCS, HDShaderIDs._RaytracingAreaWorldToLocal, sssartParams.worldToLocalMatrix);

                // Input Buffers
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowNewSampleKernel, HDShaderIDs._DepthTexture, sssartResources.depthStencilBuffer);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowNewSampleKernel, HDShaderIDs._NormalBufferTexture, sssartResources.normalBuffer);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowNewSampleKernel, HDShaderIDs._GBufferTexture[0], sssartResources.gbuffer0);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowNewSampleKernel, HDShaderIDs._GBufferTexture[1], sssartResources.gbuffer1);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowNewSampleKernel, HDShaderIDs._GBufferTexture[2], sssartResources.gbuffer2);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowNewSampleKernel, HDShaderIDs._GBufferTexture[3], sssartResources.gbuffer3);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowNewSampleKernel, HDShaderIDs._CookieAtlas, sssartResources.cookieAtlasTexture);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowNewSampleKernel, HDShaderIDs._StencilTexture, sssartResources.depthStencilBuffer, 0, RenderTextureSubElement.Stencil);

                // Output buffers
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowNewSampleKernel, HDShaderIDs._RaytracedAreaShadowSample, sssartResources.intermediateBufferRGBA1);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowNewSampleKernel, HDShaderIDs._RaytracingDirectionBuffer, sssartResources.directionBuffer);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowNewSampleKernel, HDShaderIDs._RayTracingLengthBuffer, sssartResources.rayLengthBuffer);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowNewSampleKernel, HDShaderIDs._AnalyticProbBuffer, sssartResources.intermediateBufferRG0);
                cmd.DispatchCompute(sssartParams.screenSpaceShadowsCS, sssartParams.areaRaytracingShadowNewSampleKernel, numTilesX, numTilesY, sssartParams.viewCount);

                // Input buffers
                cmd.SetRayTracingBufferParam(sssartParams.screenSpaceShadowsRT, HDShaderIDs._LightDatas, sssartResources.lightData);
                cmd.SetRayTracingTextureParam(sssartParams.screenSpaceShadowsRT, HDShaderIDs._DepthTexture, sssartResources.depthStencilBuffer);
                cmd.SetRayTracingTextureParam(sssartParams.screenSpaceShadowsRT, HDShaderIDs._NormalBufferTexture, sssartResources.normalBuffer);
                cmd.SetRayTracingTextureParam(sssartParams.screenSpaceShadowsRT, HDShaderIDs._RaytracedAreaShadowSample, sssartResources.intermediateBufferRGBA1);
                cmd.SetRayTracingTextureParam(sssartParams.screenSpaceShadowsRT, HDShaderIDs._RaytracingDirectionBuffer, sssartResources.directionBuffer);
                cmd.SetRayTracingTextureParam(sssartParams.screenSpaceShadowsRT, HDShaderIDs._RayTracingLengthBuffer, sssartResources.rayLengthBuffer);
                cmd.SetRayTracingTextureParam(sssartParams.screenSpaceShadowsRT, HDShaderIDs._AnalyticProbBuffer, sssartResources.intermediateBufferRG0);
                cmd.SetRayTracingIntParam(sssartParams.screenSpaceShadowsRT, HDShaderIDs._RaytracingTargetAreaLight, sssartParams.lightIndex);

                // Output buffers
                cmd.SetRayTracingTextureParam(sssartParams.screenSpaceShadowsRT, HDShaderIDs._RaytracedAreaShadowIntegration, sssartResources.intermediateBufferRGBA0);

                // Evaluate the intersection
                cmd.DispatchRays(sssartParams.screenSpaceShadowsRT, m_RayGenAreaShadowSingleName, (uint)sssartParams.texWidth, (uint)sssartParams.texHeight, (uint)sssartParams.viewCount);
            }

            if (sssartParams.filterTracedShadow)
            {
                Vector4 shadowChannelMask0 = new Vector4();
                Vector4 shadowChannelMask1 = new Vector4();
                Vector4 shadowChannelMask2 = new Vector4();
                GetShadowChannelMask(sssartParams.areaShadowSlot, ScreenSpaceShadowType.Area, ref shadowChannelMask0);
                GetShadowChannelMask(sssartParams.areaShadowSlot, ScreenSpaceShadowType.GrayScale, ref shadowChannelMask1);
                GetShadowChannelMask(sssartParams.areaShadowSlot + 1, ScreenSpaceShadowType.GrayScale, ref shadowChannelMask2);

                // Global parameters
                cmd.SetComputeIntParam(sssartParams.screenSpaceShadowsFilterCS, HDShaderIDs._RaytracingDenoiseRadius, sssartParams.filterSize);
                cmd.SetComputeIntParam(sssartParams.screenSpaceShadowsFilterCS, HDShaderIDs._DenoisingHistorySlice, sssartParams.areaShadowSlot / 4);
                cmd.SetComputeVectorParam(sssartParams.screenSpaceShadowsFilterCS, HDShaderIDs._DenoisingHistoryMask, shadowChannelMask0);
                cmd.SetComputeVectorParam(sssartParams.screenSpaceShadowsFilterCS, HDShaderIDs._DenoisingHistoryMaskSn, shadowChannelMask1);
                cmd.SetComputeVectorParam(sssartParams.screenSpaceShadowsFilterCS, HDShaderIDs._DenoisingHistoryMaskUn, shadowChannelMask2);

                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaShadowApplyTAAKernel, HDShaderIDs._AnalyticProbBuffer, sssartResources.intermediateBufferRG0);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaShadowApplyTAAKernel, HDShaderIDs._DepthTexture, sssartResources.depthStencilBuffer);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaShadowApplyTAAKernel, HDShaderIDs._AreaShadowHistory, sssartResources.shadowHistoryArray);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaShadowApplyTAAKernel, HDShaderIDs._AnalyticHistoryBuffer, sssartResources.analyticHistoryArray);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaShadowApplyTAAKernel, HDShaderIDs._DenoiseInputTexture, sssartResources.intermediateBufferRGBA0);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaShadowApplyTAAKernel, HDShaderIDs._DenoiseOutputTextureRW, sssartResources.intermediateBufferRGBA1);
                cmd.SetComputeFloatParam(sssartParams.screenSpaceShadowsFilterCS, HDShaderIDs._HistoryValidity, sssartParams.historyValidity);
                cmd.DispatchCompute(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaShadowApplyTAAKernel, numTilesX, numTilesY, sssartParams.viewCount);

                // Update the shadow history buffer
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaUpdateAnalyticHistoryKernel, HDShaderIDs._AnalyticProbBuffer, sssartResources.intermediateBufferRG0);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaUpdateAnalyticHistoryKernel, HDShaderIDs._AnalyticHistoryBuffer, sssartResources.analyticHistoryArray);
                cmd.DispatchCompute(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaUpdateAnalyticHistoryKernel, numTilesX, numTilesY, sssartParams.viewCount);

                // Update the analytic history buffer
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaUpdateShadowHistoryKernel, HDShaderIDs._DenoiseInputTexture, sssartResources.intermediateBufferRGBA1);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaUpdateShadowHistoryKernel, HDShaderIDs._AreaShadowHistoryRW, sssartResources.shadowHistoryArray);
                cmd.DispatchCompute(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaUpdateShadowHistoryKernel, numTilesX, numTilesY, sssartParams.viewCount);

                // Inject parameters for noise estimation
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaEstimateNoiseKernel, HDShaderIDs._DepthTexture, sssartResources.depthStencilBuffer);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaEstimateNoiseKernel, HDShaderIDs._NormalBufferTexture, sssartResources.normalBuffer);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaEstimateNoiseKernel, HDShaderIDs._ScramblingTexture, sssartParams.scramblingTex);

                // Noise estimation pre-pass
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaEstimateNoiseKernel, HDShaderIDs._DenoiseInputTexture, sssartResources.intermediateBufferRGBA1);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaEstimateNoiseKernel, HDShaderIDs._DenoiseOutputTextureRW, sssartResources.intermediateBufferRGBA0);
                cmd.DispatchCompute(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaEstimateNoiseKernel, numTilesX, numTilesY, sssartParams.viewCount);

                // Reinject parameters for denoising
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaFirstDenoiseKernel, HDShaderIDs._DepthTexture, sssartResources.depthStencilBuffer);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaFirstDenoiseKernel, HDShaderIDs._NormalBufferTexture, sssartResources.normalBuffer);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaFirstDenoiseKernel, HDShaderIDs._ScreenSpaceShadowsTextureRW, sssartResources.screenSpaceShadowTextureArray);

                // First denoising pass
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaFirstDenoiseKernel, HDShaderIDs._DenoiseInputTexture, sssartResources.intermediateBufferRGBA0);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaFirstDenoiseKernel, HDShaderIDs._DenoiseOutputTextureRW, sssartResources.intermediateBufferRGBA1);
                cmd.DispatchCompute(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaFirstDenoiseKernel, numTilesX, numTilesY, sssartParams.viewCount);

                // Re-inject parameters for denoising
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaSecondDenoiseKernel, HDShaderIDs._DepthTexture, sssartResources.depthStencilBuffer);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaSecondDenoiseKernel, HDShaderIDs._NormalBufferTexture, sssartResources.normalBuffer);

                // Second (and final) denoising pass
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaSecondDenoiseKernel, HDShaderIDs._DenoiseInputTexture, sssartResources.intermediateBufferRGBA1);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaSecondDenoiseKernel, HDShaderIDs._DenoiseOutputTextureRW, sssartResources.intermediateBufferRGBA0);
                cmd.DispatchCompute(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaSecondDenoiseKernel, numTilesX, numTilesY, sssartParams.viewCount);
            }
            else
            {
                Vector4 shadowChannelMask0 = new Vector4();
                int     areaShadowSlice    = sssartParams.areaShadowSlot / 4;
                GetShadowChannelMask(sssartParams.areaShadowSlot, ScreenSpaceShadowType.Area, ref shadowChannelMask0);
                cmd.SetComputeVectorParam(sssartParams.screenSpaceShadowsFilterCS, HDShaderIDs._DenoisingHistoryMask, shadowChannelMask0);
                cmd.SetComputeIntParam(sssartParams.screenSpaceShadowsFilterCS, HDShaderIDs._DenoisingHistorySlice, areaShadowSlice);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaShadowNoDenoiseKernel, HDShaderIDs._DenoiseInputTexture, sssartResources.intermediateBufferRGBA0);
                cmd.SetComputeTextureParam(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaShadowNoDenoiseKernel, HDShaderIDs._ScreenSpaceShadowsTextureRW, sssartResources.screenSpaceShadowTextureArray);
                cmd.DispatchCompute(sssartParams.screenSpaceShadowsFilterCS, sssartParams.areaShadowNoDenoiseKernel, numTilesX, numTilesY, sssartParams.viewCount);
            }
        }