コード例 #1
0
        DiffuseShadowSphereDenoiserParameters PrepareDiffuseShadowSphereDenoiserParameters(HDCamera hdCamera, Vector3 lightPosition, float lightRadius, int kernelSize)
        {
            DiffuseShadowSphereDenoiserParameters dssdParams = new DiffuseShadowSphereDenoiserParameters();

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

            // Evaluation parameters
            dssdParams.cameraFov     = hdCamera.camera.fieldOfView * Mathf.PI / 180.0f;
            dssdParams.lightPosition = lightPosition;
            // Make sure the position is in the right space before injecting it
            if (ShaderConfig.s_CameraRelativeRendering != 0)
            {
                dssdParams.lightPosition -= hdCamera.camera.transform.position;
            }
            dssdParams.lightRadius = lightRadius;
            dssdParams.kernelSize  = kernelSize;

            // Kernels
            dssdParams.bilateralHKernel = m_BilateralFilterHSingleSphereKernel;
            dssdParams.bilateralVKernel = m_BilateralFilterVSingleSphereKernel;

            // Other parameters
            dssdParams.diffuseShadowDenoiserCS = m_ShadowDenoiser;
            return(dssdParams);
        }
コード例 #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);
        }
コード例 #3
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);
        }
コード例 #4
0
        DiffuseShadowSphereDenoiserParameters PrepareDiffuseShadowSphereDenoiserParameters(HDCamera hdCamera, Vector3 lightPosition, float lightRadius, int kernelSize)
        {
            DiffuseShadowSphereDenoiserParameters dssdParams = new DiffuseShadowSphereDenoiserParameters();

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

            // Evaluation parameters
            dssdParams.cameraFov     = hdCamera.camera.fieldOfView * Mathf.PI / 180.0f;
            dssdParams.lightPosition = lightPosition;
            dssdParams.lightRadius   = lightRadius;
            dssdParams.kernelSize    = kernelSize;

            // Kernels
            dssdParams.bilateralHKernel = m_BilateralFilterHSingleSphereKernel;
            dssdParams.bilateralVKernel = m_BilateralFilterVSingleSphereKernel;

            // Other parameters
            dssdParams.diffuseShadowDenoiserCS = m_ShadowDenoiser;
            return(dssdParams);
        }