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); } }