Пример #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
        WriteScreenSpaceShadowParameters PrepareWriteScreenSpaceShadowParameters(HDCamera hdCamera, int shadowSlot, ScreenSpaceShadowType shadowType)
        {
            WriteScreenSpaceShadowParameters wsssParams = new WriteScreenSpaceShadowParameters();

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

            // Evaluation parameters
            GetShadowChannelMask(shadowSlot, shadowType, ref wsssParams.shadowChannelMask);
            // If the light is an area, we also need to grab the individual channels
            if (shadowType == ScreenSpaceShadowType.Area)
            {
                GetShadowChannelMask(shadowSlot, ScreenSpaceShadowType.GrayScale, ref wsssParams.shadowChannelMask0);
                GetShadowChannelMask(shadowSlot + 1, ScreenSpaceShadowType.GrayScale, ref wsssParams.shadowChannelMask1);
            }
            wsssParams.shadowSlot = shadowSlot;

            // Kernel
            switch (shadowType)
            {
            case ScreenSpaceShadowType.GrayScale:
            {
                wsssParams.shadowKernel = m_OutputShadowTextureKernel;
            }
            break;

            case ScreenSpaceShadowType.Area:
            {
                wsssParams.shadowKernel = m_OutputSpecularShadowTextureKernel;
            }
            break;

            case ScreenSpaceShadowType.Color:
            {
                wsssParams.shadowKernel = m_OutputColorShadowTextureKernel;
            }
            break;
            }

            // Other parameters
            wsssParams.screenSpaceShadowCS = m_ScreenSpaceShadowsCS;

            return(wsssParams);
        }
Пример #3
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.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);
        }
Пример #4
0
        WriteScreenSpaceShadowParameters PrepareWriteScreenSpaceShadowParameters(HDCamera hdCamera, int shadowSlot, ScreenSpaceShadowType shadowType)
        {
            WriteScreenSpaceShadowParameters wsssParams = new WriteScreenSpaceShadowParameters();

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

            // Evaluation parameters
            GetShadowChannelMask(shadowSlot, shadowType, ref wsssParams.shadowChannelMask);
            wsssParams.shadowSlot = shadowSlot;

            // Kernel
            wsssParams.shadowKernel = (shadowType == ScreenSpaceShadowType.Color ? m_OutputColorShadowTextureKernel : m_OutputShadowTextureKernel);

            // Other parameters
            wsssParams.screenSpaceShadowCS = m_ScreenSpaceShadowsCS;

            return(wsssParams);
        }