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