예제 #1
0
        void RenderRayTracedDirectionalScreenSpaceShadow(CommandBuffer cmd, HDCamera hdCamera)
        {
            // Request the intermediate buffers we shall be using
            RTHandle outputShadowBuffer = GetRayTracingBuffer(InternalRayTracingBuffers.RGBA0);
            RTHandle directionBuffer    = GetRayTracingBuffer(InternalRayTracingBuffers.Direction);
            RTHandle velocityBuffer     = GetRayTracingBuffer(InternalRayTracingBuffers.R1);
            RTHandle distanceBuffer     = GetRayTracingBuffer(InternalRayTracingBuffers.Distance);

            // Ray trace for shadow evaluation
            RTShadowDirectionalTraceParameters rtsdtParams    = PrepareRTShadowDirectionalTraceParameters(hdCamera, m_CurrentSunLightAdditionalLightData);
            RTShadowDirectionalTraceResources  rtsdtResources = PrepareSSSDirectionalTraceResources(velocityBuffer, directionBuffer, distanceBuffer, outputShadowBuffer);

            ExecuteSSSDirectionalTrace(cmd, rtsdtParams, rtsdtResources);

            // If required, denoise the shadow
            if (m_CurrentSunLightAdditionalLightData.filterTracedShadow && rtsdtParams.softShadow)
            {
                DenoiseDirectionalScreenSpaceShadow(cmd, hdCamera, velocityBuffer, distanceBuffer, outputShadowBuffer);
            }

            // Write the result texture to the screen space shadow buffer
            int dirShadowIndex = m_CurrentSunLightDirectionalLightData.screenSpaceShadowIndex & (int)LightDefinitions.s_ScreenSpaceShadowIndexMask;
            WriteScreenSpaceShadowParameters wsssParams    = PrepareWriteScreenSpaceShadowParameters(hdCamera, dirShadowIndex, m_CurrentSunLightAdditionalLightData.colorShadow ? ScreenSpaceShadowType.Color : ScreenSpaceShadowType.GrayScale);
            WriteScreenSpaceShadowResources  wsssResources = PrepareWriteScreenSpaceShadowResources(outputShadowBuffer);

            ExecuteWriteScreenSpaceShadow(cmd, wsssParams, wsssResources);
        }
예제 #2
0
        WriteScreenSpaceShadowResources PrepareWriteScreenSpaceShadowResources(RTHandle inputShadowBuffer)
        {
            WriteScreenSpaceShadowResources wsssResources = new WriteScreenSpaceShadowResources();

            wsssResources.inputShadowBuffer       = inputShadowBuffer;
            wsssResources.outputShadowArrayBuffer = m_ScreenSpaceShadowTextureArray;
            return(wsssResources);
        }
        void WriteScreenSpaceShadow(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle shadowTexture, TextureHandle screenSpaceShadowArray, int shadowIndex, ScreenSpaceShadowType shadowType)
        {
            // Write the result texture to the screen space shadow buffer
            using (var builder = renderGraph.AddRenderPass <WriteScreenSpaceShadowPassData>("Write Screen Space Shadows", out var passData, ProfilingSampler.Get(HDProfileId.RaytracingWriteShadow)))
            {
                passData.parameters              = PrepareWriteScreenSpaceShadowParameters(hdCamera, shadowIndex, shadowType);
                passData.inputShadowBuffer       = builder.ReadTexture(shadowTexture);
                passData.outputShadowArrayBuffer = builder.WriteTexture(builder.ReadTexture(screenSpaceShadowArray));

                builder.SetRenderFunc(
                    (WriteScreenSpaceShadowPassData data, RenderGraphContext context) =>
                {
                    WriteScreenSpaceShadowResources resources = new WriteScreenSpaceShadowResources();
                    resources.inputShadowBuffer       = data.inputShadowBuffer;
                    resources.outputShadowArrayBuffer = data.outputShadowArrayBuffer;
                    ExecuteWriteScreenSpaceShadow(context.cmd, data.parameters, resources);
                });
            }
        }
예제 #4
0
        static void ExecuteWriteScreenSpaceShadow(CommandBuffer cmd, WriteScreenSpaceShadowParameters wsssParams, WriteScreenSpaceShadowResources wsssResources)
        {
            // Evaluate the dispatch parameters
            int shadowTileSize = 8;
            int numTilesX      = (wsssParams.texWidth + (shadowTileSize - 1)) / shadowTileSize;
            int numTilesY      = (wsssParams.texHeight + (shadowTileSize - 1)) / shadowTileSize;

            // Bind the input data
            cmd.SetComputeIntParam(wsssParams.screenSpaceShadowCS, HDShaderIDs._RaytracingShadowSlot, wsssParams.shadowSlot / 4);
            cmd.SetComputeVectorParam(wsssParams.screenSpaceShadowCS, HDShaderIDs._RaytracingChannelMask, wsssParams.shadowChannelMask);
            cmd.SetComputeVectorParam(wsssParams.screenSpaceShadowCS, HDShaderIDs._RaytracingChannelMask0, wsssParams.shadowChannelMask0);
            cmd.SetComputeVectorParam(wsssParams.screenSpaceShadowCS, HDShaderIDs._RaytracingChannelMask1, wsssParams.shadowChannelMask1);
            cmd.SetComputeTextureParam(wsssParams.screenSpaceShadowCS, wsssParams.shadowKernel, HDShaderIDs._RaytracedShadowIntegration, wsssResources.inputShadowBuffer);

            // Bind the output texture
            cmd.SetComputeTextureParam(wsssParams.screenSpaceShadowCS, wsssParams.shadowKernel, HDShaderIDs._ScreenSpaceShadowsTextureRW, wsssResources.outputShadowArrayBuffer);

            //Do our copy
            cmd.DispatchCompute(wsssParams.screenSpaceShadowCS, wsssParams.shadowKernel, numTilesX, numTilesY, wsssParams.viewCount);
        }