Пример #1
0
        public void DenoiseBufferNoHistory(CommandBuffer cmd, HDCamera hdCamera, RTHandle noisyBuffer, RTHandle outputBuffer, int kernelSize, bool singleChannel = true)
        {
            // Request the intermediate buffers that we need
            RTHandle intermediateBuffer          = m_RenderPipeline.GetRayTracingBuffer(InternalRayTracingBuffers.RGBA3);
            SimpleDenoiserParameters sdParams    = PrepareSimpleDenoiserParameters(hdCamera, singleChannel, kernelSize);
            SimpleDenoiserResources  sdResources = PrepareSimpleDenoiserResources(noisyBuffer, intermediateBuffer, outputBuffer);

            ExecuteSimpleDenoiser(cmd, sdParams, sdResources);
        }
Пример #2
0
        public TextureHandle DenoiseBufferNoHistory(RenderGraph renderGraph, HDCamera hdCamera,
                                                    TextureHandle depthBuffer, TextureHandle normalBuffer,
                                                    TextureHandle noisyBuffer,
                                                    int kernelSize, bool singleChannel)
        {
            using (var builder = renderGraph.AddRenderPass <SimpleDenoiserPassData>("DiffuseDenoiser", out var passData, ProfilingSampler.Get(HDProfileId.DiffuseFilter)))
            {
                // Cannot run in async
                builder.EnableAsyncCompute(false);

                // Fetch all the resources
                passData.parameters = PrepareSimpleDenoiserParameters(hdCamera, singleChannel, kernelSize);

                // Input buffers
                passData.depthStencilBuffer = builder.UseDepthBuffer(depthBuffer, DepthAccess.Read);
                passData.normalBuffer       = builder.ReadTexture(normalBuffer);
                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.ReadWriteTexture(renderGraph.CreateTexture(new TextureDesc(Vector2.one, true, true)
                {
                    colorFormat = GraphicsFormat.R16G16B16A16_SFloat, enableRandomWrite = true, name = "Denoised Buffer"
                }));


                builder.SetRenderFunc(
                    (SimpleDenoiserPassData data, RenderGraphContext ctx) =>
                {
                    SimpleDenoiserResources resources = new SimpleDenoiserResources();
                    resources.depthStencilBuffer      = data.depthStencilBuffer;
                    resources.normalBuffer            = data.normalBuffer;
                    resources.noisyBuffer             = data.noisyBuffer;

                    resources.intermediateBuffer = data.intermediateBuffer;

                    resources.outputBuffer = data.outputBuffer;
                    ExecuteSimpleDenoiser(ctx.cmd, data.parameters, resources);
                });
                return(passData.outputBuffer);
            }
        }
Пример #3
0
        SimpleDenoiserResources PrepareSimpleDenoiserResources(RTHandle noisyBuffer, RTHandle intermediateBuffer, RTHandle outputBuffer)
        {
            SimpleDenoiserResources sdResources = new SimpleDenoiserResources();

            // Input buffers
            sdResources.noisyBuffer        = noisyBuffer;
            sdResources.depthStencilBuffer = m_SharedRTManager.GetDepthStencilBuffer();
            sdResources.normalBuffer       = m_SharedRTManager.GetNormalBuffer();

            // Temporary buffers
            sdResources.intermediateBuffer = intermediateBuffer;

            // Output buffers
            sdResources.outputBuffer = outputBuffer;

            return(sdResources);
        }
Пример #4
0
        static void ExecuteSimpleDenoiser(CommandBuffer cmd, SimpleDenoiserParameters sdParams, SimpleDenoiserResources sdResources)
        {
            // Evaluate the dispatch parameters
            int sdTileSize = 8;
            int numTilesX  = (sdParams.texWidth + (sdTileSize - 1)) / sdTileSize;
            int numTilesY  = (sdParams.texHeight + (sdTileSize - 1)) / sdTileSize;

            // Horizontal pass of the bilateral filter
            cmd.SetComputeIntParam(sdParams.simpleDenoiserCS, HDShaderIDs._DenoiserFilterRadius, sdParams.kernelSize);
            cmd.SetComputeTextureParam(sdParams.simpleDenoiserCS, sdParams.bilateralHKernel, HDShaderIDs._DenoiseInputTexture, sdResources.noisyBuffer);
            cmd.SetComputeTextureParam(sdParams.simpleDenoiserCS, sdParams.bilateralHKernel, HDShaderIDs._DepthTexture, sdResources.depthStencilBuffer);
            cmd.SetComputeTextureParam(sdParams.simpleDenoiserCS, sdParams.bilateralHKernel, HDShaderIDs._NormalBufferTexture, sdResources.normalBuffer);
            cmd.SetComputeTextureParam(sdParams.simpleDenoiserCS, sdParams.bilateralHKernel, HDShaderIDs._DenoiseOutputTextureRW, sdResources.intermediateBuffer);
            cmd.DispatchCompute(sdParams.simpleDenoiserCS, sdParams.bilateralHKernel, numTilesX, numTilesY, sdParams.viewCount);

            // Horizontal pass of the bilateral filter
            cmd.SetComputeIntParam(sdParams.simpleDenoiserCS, HDShaderIDs._DenoiserFilterRadius, sdParams.kernelSize);
            cmd.SetComputeTextureParam(sdParams.simpleDenoiserCS, sdParams.bilateralVKernel, HDShaderIDs._DenoiseInputTexture, sdResources.intermediateBuffer);
            cmd.SetComputeTextureParam(sdParams.simpleDenoiserCS, sdParams.bilateralVKernel, HDShaderIDs._DepthTexture, sdResources.depthStencilBuffer);
            cmd.SetComputeTextureParam(sdParams.simpleDenoiserCS, sdParams.bilateralVKernel, HDShaderIDs._NormalBufferTexture, sdResources.normalBuffer);
            cmd.SetComputeTextureParam(sdParams.simpleDenoiserCS, sdParams.bilateralVKernel, HDShaderIDs._DenoiseOutputTextureRW, sdResources.outputBuffer);
            cmd.DispatchCompute(sdParams.simpleDenoiserCS, sdParams.bilateralVKernel, numTilesX, numTilesY, sdParams.viewCount);
        }