Example #1
0
        public TextureHandle DenoiseBufferSphere(RenderGraph renderGraph, HDCamera hdCamera,
                                                 TextureHandle depthBuffer, TextureHandle normalBuffer,
                                                 TextureHandle noisyBuffer, TextureHandle distanceBuffer,
                                                 int kernelSize, Vector3 lightPosition, float lightRadius)
        {
            using (var builder = renderGraph.AddRenderPass <DiffuseShadowDenoiserSpherePassData>("DiffuseDenoiser", out var passData, ProfilingSampler.Get(HDProfileId.DiffuseFilter)))
            {
                // Cannot run in async
                builder.EnableAsyncCompute(false);

                // Fetch all the resources
                passData.parameters = PrepareDiffuseShadowSphereDenoiserParameters(hdCamera, lightPosition, lightRadius, kernelSize);

                // Input buffers
                passData.depthStencilBuffer = builder.UseDepthBuffer(depthBuffer, DepthAccess.Read);
                passData.normalBuffer       = builder.ReadTexture(normalBuffer);
                passData.distanceBuffer     = builder.ReadTexture(distanceBuffer);
                passData.noisyBuffer        = builder.ReadTexture(noisyBuffer);

                // Temporary buffers
                passData.intermediateBuffer = builder.CreateTransientTexture(new TextureDesc(Vector2.one, true, true)
                {
                    colorFormat = GraphicsFormat.R16G16B16A16_SFloat, enableRandomWrite = true, name = "Intermediate buffer"
                });

                // Output buffer
                passData.outputBuffer = builder.ReadTexture(builder.WriteTexture(renderGraph.CreateTexture(new TextureDesc(Vector2.one, true, true)
                {
                    colorFormat = GraphicsFormat.R16G16B16A16_SFloat, enableRandomWrite = true, name = "Denoised Buffer"
                })));
                passData.outputBuffer = builder.ReadWriteTexture(renderGraph.CreateTexture(new TextureDesc(Vector2.one, true, true)
                {
                    colorFormat = GraphicsFormat.R16G16B16A16_SFloat, enableRandomWrite = true, name = "Denoised Buffer"
                }));
                passData.outputBuffer = builder.ReadTexture(builder.WriteTexture(renderGraph.CreateTexture(new TextureDesc(Vector2.one, true, true)
                {
                    colorFormat = GraphicsFormat.R16G16B16A16_SFloat, enableRandomWrite = true, name = "Denoised Buffer"
                })));


                builder.SetRenderFunc(
                    (DiffuseShadowDenoiserSpherePassData data, RenderGraphContext ctx) =>
                {
                    DiffuseShadowSphereDenoiserResources resources = new DiffuseShadowSphereDenoiserResources();
                    resources.depthStencilBuffer = data.depthStencilBuffer;
                    resources.normalBuffer       = data.normalBuffer;
                    resources.distanceBuffer     = data.distanceBuffer;
                    resources.noisyBuffer        = data.noisyBuffer;

                    resources.intermediateBuffer = data.intermediateBuffer;

                    resources.outputBuffer = data.outputBuffer;
                    ExecuteDiffuseShadowSphereDenoiser(ctx.cmd, data.parameters, resources);
                });
                return(passData.outputBuffer);
            }
        }
Example #2
0
        public void DenoiseBufferSphere(CommandBuffer cmd, HDCamera hdCamera,
                                        RTHandle noisyBuffer, RTHandle distanceBuffer, RTHandle outputBuffer,
                                        int kernelSize, Vector3 lightPosition, float lightRadius)
        {
            // Request the intermediate buffers that we need
            RTHandle intermediateBuffer = m_RenderPipeline.GetRayTracingBuffer(InternalRayTracingBuffers.RGBA3);

            DiffuseShadowSphereDenoiserParameters dssdParams    = PrepareDiffuseShadowSphereDenoiserParameters(hdCamera, lightPosition, lightRadius, kernelSize);
            DiffuseShadowSphereDenoiserResources  dssdResources = PrepareDiffuseShadowSphereDenoiserResources(distanceBuffer, noisyBuffer, intermediateBuffer, outputBuffer);

            ExecuteDiffuseShadowSphereDenoiser(cmd, dssdParams, dssdResources);
        }
Example #3
0
        DiffuseShadowSphereDenoiserResources PrepareDiffuseShadowSphereDenoiserResources(RTHandle distanceBuffer, RTHandle noisyBuffer, RTHandle intermediateBuffer, RTHandle outputBuffer)
        {
            DiffuseShadowSphereDenoiserResources dssdResources = new DiffuseShadowSphereDenoiserResources();

            dssdResources.depthStencilBuffer = m_SharedRTManager.GetDepthStencilBuffer();
            dssdResources.normalBuffer       = m_SharedRTManager.GetNormalBuffer();
            dssdResources.distanceBuffer     = distanceBuffer;
            dssdResources.noisyBuffer        = noisyBuffer;
            dssdResources.intermediateBuffer = intermediateBuffer;
            dssdResources.outputBuffer       = outputBuffer;

            return(dssdResources);
        }
Example #4
0
        static void ExecuteDiffuseShadowSphereDenoiser(CommandBuffer cmd, DiffuseShadowSphereDenoiserParameters dssdParams, DiffuseShadowSphereDenoiserResources dssdResources)
        {
            // Evaluate the dispatch parameters
            int shadowTileSize = 8;
            int numTilesX      = (dssdParams.texWidth + (shadowTileSize - 1)) / shadowTileSize;
            int numTilesY      = (dssdParams.texHeight + (shadowTileSize - 1)) / shadowTileSize;

            // Bind input uniforms
            cmd.SetComputeIntParam(dssdParams.diffuseShadowDenoiserCS, HDShaderIDs._DenoiserFilterRadius, dssdParams.kernelSize);
            cmd.SetComputeVectorParam(dssdParams.diffuseShadowDenoiserCS, HDShaderIDs._SphereLightPosition, dssdParams.lightPosition);
            cmd.SetComputeFloatParam(dssdParams.diffuseShadowDenoiserCS, HDShaderIDs._SphereLightRadius, dssdParams.lightRadius);
            cmd.SetComputeFloatParam(dssdParams.diffuseShadowDenoiserCS, HDShaderIDs._CameraFOV, dssdParams.cameraFov);

            // Bind Input Textures
            cmd.SetComputeTextureParam(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralHKernel, HDShaderIDs._DepthTexture, dssdResources.depthStencilBuffer);
            cmd.SetComputeTextureParam(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralHKernel, HDShaderIDs._NormalBufferTexture, dssdResources.normalBuffer);
            cmd.SetComputeTextureParam(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralHKernel, HDShaderIDs._DenoiseInputTexture, dssdResources.noisyBuffer);
            cmd.SetComputeTextureParam(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralHKernel, HDShaderIDs._DistanceTexture, dssdResources.distanceBuffer);

            // Bind output textures
            cmd.SetComputeTextureParam(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralHKernel, HDShaderIDs._DenoiseOutputTextureRW, dssdResources.intermediateBuffer);

            // Do the Horizontal pass
            cmd.DispatchCompute(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralHKernel, numTilesX, numTilesY, dssdParams.viewCount);

            // Bind input uniforms
            cmd.SetComputeIntParam(dssdParams.diffuseShadowDenoiserCS, HDShaderIDs._DenoiserFilterRadius, dssdParams.kernelSize);
            cmd.SetComputeVectorParam(dssdParams.diffuseShadowDenoiserCS, HDShaderIDs._SphereLightPosition, dssdParams.lightPosition);
            cmd.SetComputeFloatParam(dssdParams.diffuseShadowDenoiserCS, HDShaderIDs._SphereLightRadius, dssdParams.lightRadius);
            cmd.SetComputeFloatParam(dssdParams.diffuseShadowDenoiserCS, HDShaderIDs._CameraFOV, dssdParams.cameraFov);

            cmd.SetComputeTextureParam(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralVKernel, HDShaderIDs._DenoiseInputTexture, dssdResources.intermediateBuffer);
            cmd.SetComputeTextureParam(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralVKernel, HDShaderIDs._DistanceTexture, dssdResources.distanceBuffer);
            cmd.SetComputeTextureParam(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralVKernel, HDShaderIDs._DepthTexture, dssdResources.depthStencilBuffer);
            cmd.SetComputeTextureParam(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralVKernel, HDShaderIDs._NormalBufferTexture, dssdResources.normalBuffer);

            // Bind output textures
            cmd.SetComputeTextureParam(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralVKernel, HDShaderIDs._DenoiseOutputTextureRW, dssdResources.outputBuffer);

            // Do the Vertical pass
            cmd.DispatchCompute(dssdParams.diffuseShadowDenoiserCS, dssdParams.bilateralVKernel, numTilesX, numTilesY, dssdParams.viewCount);
        }