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); }
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); }
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); }
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); }