void EvaluateShadowDebugView(CommandBuffer cmd, HDCamera hdCamera) { // If this is the right debug mode and the index we are asking for is in the range HDRenderPipeline hdrp = (RenderPipelineManager.currentPipeline as HDRenderPipeline); if (FullScreenDebugMode.ScreenSpaceShadows == hdrp.m_CurrentDebugDisplaySettings.data.fullScreenDebugMode) { if (!hdrp.rayTracingSupported || (m_ScreenSpaceShadowChannelSlot <= hdrp.m_CurrentDebugDisplaySettings.data.screenSpaceShadowIndex)) { // In this case we have not rendered any screenspace shadows, so push a black texture on the debug display hdrp.PushFullScreenDebugTexture(hdCamera, cmd, TextureXR.GetBlackTextureArray(), FullScreenDebugMode.ScreenSpaceShadows); return; } // Fetch the buffer where we we will store our result RTHandle debugResultBuffer = GetRayTracingBuffer(InternalRayTracingBuffers.RGBA0); // Generate the debug view SSShadowDebugParameters sssdParams = PrepareSSShadowDebugParameters(hdCamera, (int)hdrp.m_CurrentDebugDisplaySettings.data.screenSpaceShadowIndex); SSShadowDebugResources sssdResources = PrepareSSShadowDebugResources(debugResultBuffer); ExecuteShadowDebugView(cmd, sssdParams, sssdResources); // Push the full screen debug texture hdrp.PushFullScreenDebugTexture(hdCamera, cmd, debugResultBuffer, FullScreenDebugMode.ScreenSpaceShadows); } }
static void ExecuteShadowDebugView(CommandBuffer cmd, SSShadowDebugParameters sssdParams, SSShadowDebugResources sssdResources) { // Evaluate the dispatch parameters int shadowTileSize = 8; int numTilesX = (sssdParams.texWidth + (shadowTileSize - 1)) / shadowTileSize; int numTilesY = (sssdParams.texHeight + (shadowTileSize - 1)) / shadowTileSize; // If the screen space shadows we are asked to deliver is available output it to the intermediate texture cmd.SetComputeIntParam(sssdParams.shadowFilter, HDShaderIDs._DenoisingHistorySlot, sssdParams.targetShadow); cmd.SetComputeTextureParam(sssdParams.shadowFilter, sssdParams.debugKernel, HDShaderIDs._ScreenSpaceShadowsTextureRW, sssdResources.screenSpaceShadowArray); cmd.SetComputeTextureParam(sssdParams.shadowFilter, sssdParams.debugKernel, HDShaderIDs._DenoiseOutputTextureRW, sssdResources.outputBuffer); cmd.DispatchCompute(sssdParams.shadowFilter, sssdParams.debugKernel, numTilesX, numTilesY, sssdParams.viewCount); }
SSShadowDebugParameters PrepareSSShadowDebugParameters(HDCamera hdCamera, int targetShadow) { SSShadowDebugParameters sssdParams = new SSShadowDebugParameters(); // Set the camera parameters sssdParams.texWidth = hdCamera.actualWidth; sssdParams.texHeight = hdCamera.actualHeight; sssdParams.viewCount = hdCamera.viewCount; // Evaluation params sssdParams.targetShadow = targetShadow; // Kernel to be used sssdParams.debugKernel = m_WriteShadowTextureDebugKernel; // TODO: move the debug kernel outside of the ray tracing resources sssdParams.shadowFilter = m_Asset.renderPipelineRayTracingResources.shadowFilterCS; return(sssdParams); }