Exemplo n.º 1
0
        public void DenoiseBufferDirectional(CommandBuffer cmd, HDCamera hdCamera,
                                             RTHandle noisyBuffer, RTHandle distanceBuffer, RTHandle outputBuffer,
                                             int kernelSize, float angularDiameter, bool singleChannel = true)
        {
            // Request the intermediate buffer we need
            RTHandle intermediateBuffer = m_RenderPipeline.GetRayTracingBuffer(InternalRayTracingBuffers.RGBA3);

            DiffuseShadowDirectionalDenoiserParameters dsddParams    = PrepareDiffuseShadowDirectionalDenoiserParameters(hdCamera, angularDiameter, kernelSize, singleChannel);
            DiffuseShadowDirectionalDenoiserResources  dsddResources = PrepareDiffuseShadowDirectionalDenoiserResources(distanceBuffer, noisyBuffer, intermediateBuffer, outputBuffer);

            ExecuteDiffuseShadowDirectionalDenoiser(cmd, dsddParams, dsddResources);
        }
Exemplo n.º 2
0
        DiffuseShadowDirectionalDenoiserResources PrepareDiffuseShadowDirectionalDenoiserResources(RTHandle distanceBuffer, RTHandle noisyBuffer, RTHandle intermediateBuffer, RTHandle outputBuffer)
        {
            DiffuseShadowDirectionalDenoiserResources dsddResources = new DiffuseShadowDirectionalDenoiserResources();

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

            return(dsddResources);
        }
Exemplo n.º 3
0
        public TextureHandle DenoiseBufferDirectional(RenderGraph renderGraph, HDCamera hdCamera,
                                                      TextureHandle depthBuffer, TextureHandle normalBuffer,
                                                      TextureHandle noisyBuffer, TextureHandle distanceBuffer,
                                                      int kernelSize, float angularDiameter, bool singleChannel = true)
        {
            using (var builder = renderGraph.AddRenderPass <DiffuseShadowDenoiserDirectionalPassData>("TemporalDenoiser", out var passData, ProfilingSampler.Get(HDProfileId.DiffuseFilter)))
            {
                // Cannot run in async
                builder.EnableAsyncCompute(false);

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

                // 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.ReadWriteTexture(renderGraph.CreateTexture(new TextureDesc(Vector2.one, true, true)
                {
                    colorFormat = GraphicsFormat.R16G16B16A16_SFloat, enableRandomWrite = true, name = "Denoised Buffer"
                }));


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

                    resources.intermediateBuffer = data.intermediateBuffer;

                    resources.outputBuffer = data.outputBuffer;
                    ExecuteDiffuseShadowDirectionalDenoiser(ctx.cmd, data.parameters, resources);
                });
                return(passData.outputBuffer);
            }
        }
Exemplo n.º 4
0
        static void ExecuteDiffuseShadowDirectionalDenoiser(CommandBuffer cmd, DiffuseShadowDirectionalDenoiserParameters dsddParams, DiffuseShadowDirectionalDenoiserResources dsddResources)
        {
            // Evaluate the dispatch parameters
            int denoiserTileSize = 8;
            int numTilesX        = (dsddParams.texWidth + (denoiserTileSize - 1)) / denoiserTileSize;
            int numTilesY        = (dsddParams.texHeight + (denoiserTileSize - 1)) / denoiserTileSize;

            // Bind input uniforms
            cmd.SetComputeFloatParam(dsddParams.diffuseShadowDenoiserCS, HDShaderIDs._DirectionalLightAngle, dsddParams.lightAngle);
            cmd.SetComputeIntParam(dsddParams.diffuseShadowDenoiserCS, HDShaderIDs._DenoiserFilterRadius, dsddParams.kernelSize);
            cmd.SetComputeFloatParam(dsddParams.diffuseShadowDenoiserCS, HDShaderIDs._CameraFOV, dsddParams.cameraFov);

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

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

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

            // Bind input uniforms
            cmd.SetComputeIntParam(dsddParams.diffuseShadowDenoiserCS, HDShaderIDs._DenoiserFilterRadius, dsddParams.kernelSize);
            cmd.SetComputeFloatParam(dsddParams.diffuseShadowDenoiserCS, HDShaderIDs._DirectionalLightAngle, dsddParams.lightAngle);
            cmd.SetComputeFloatParam(dsddParams.diffuseShadowDenoiserCS, HDShaderIDs._CameraFOV, dsddParams.cameraFov);

            // Bind Input Textures
            cmd.SetComputeTextureParam(dsddParams.diffuseShadowDenoiserCS, dsddParams.bilateralVKernel, HDShaderIDs._DepthTexture, dsddResources.depthStencilBuffer);
            cmd.SetComputeTextureParam(dsddParams.diffuseShadowDenoiserCS, dsddParams.bilateralVKernel, HDShaderIDs._NormalBufferTexture, dsddResources.normalBuffer);
            cmd.SetComputeTextureParam(dsddParams.diffuseShadowDenoiserCS, dsddParams.bilateralVKernel, HDShaderIDs._DenoiseInputTexture, dsddResources.intermediateBuffer);
            cmd.SetComputeTextureParam(dsddParams.diffuseShadowDenoiserCS, dsddParams.bilateralVKernel, HDShaderIDs._DistanceTexture, dsddResources.distanceBuffer);

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

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