public TextureHandle RenderRTAO(RenderGraph renderGraph, HDCamera hdCamera, TextureHandle depthPyramid, TextureHandle normalBuffer, TextureHandle motionVectors, TextureHandle rayCountTexture, int frameCount, ShaderVariablesRaytracing shaderVariablesRaytracing) { var settings = hdCamera.volumeStack.GetComponent <AmbientOcclusion>(); TextureHandle result; if (m_RenderPipeline.GetRayTracingState()) { // Trace the signal AmbientOcclusionTraceParameters aoParameters = PrepareAmbientOcclusionTraceParameters(hdCamera, shaderVariablesRaytracing); result = TraceAO(renderGraph, aoParameters, depthPyramid, normalBuffer, rayCountTexture); // Denoise if required result = DenoiseAO(renderGraph, hdCamera, result, depthPyramid, normalBuffer, motionVectors); // Compose the result to be done AmbientOcclusionComposeParameters aoComposeParameters = PrepareAmbientOcclusionComposeParameters(hdCamera, shaderVariablesRaytracing); result = ComposeAO(renderGraph, aoComposeParameters, result); } else { result = renderGraph.defaultResources.blackTextureXR; } return(result); }
static public void TraceAO(CommandBuffer cmd, AmbientOcclusionTraceParameters aoTraceParameters, AmbientOcclusionTraceResources aoTraceResources) { // Define the shader pass to use for the reflection pass cmd.SetRayTracingShaderPass(aoTraceParameters.aoShaderRT, "VisibilityDXR"); // Set the acceleration structure for the pass cmd.SetRayTracingAccelerationStructure(aoTraceParameters.aoShaderRT, HDShaderIDs._RaytracingAccelerationStructureName, aoTraceResources.rayTracingAccelerationStructure); // Inject the ray generation data (be careful of the global constant buffer limitation) aoTraceParameters.raytracingCB._RaytracingRayMaxLength = aoTraceParameters.rayLength; aoTraceParameters.raytracingCB._RaytracingNumSamples = aoTraceParameters.sampleCount; ConstantBuffer.PushGlobal(cmd, aoTraceParameters.raytracingCB, HDShaderIDs._ShaderVariablesRaytracing); // Set the data for the ray generation cmd.SetRayTracingTextureParam(aoTraceParameters.aoShaderRT, HDShaderIDs._DepthTexture, aoTraceResources.depthStencilBuffer); cmd.SetRayTracingTextureParam(aoTraceParameters.aoShaderRT, HDShaderIDs._NormalBufferTexture, aoTraceResources.normalBuffer); // Inject the ray-tracing sampling data BlueNoise.BindDitheredTextureSet(cmd, aoTraceResources.ditheredTextureSet); // Set the output textures cmd.SetRayTracingTextureParam(aoTraceParameters.aoShaderRT, HDShaderIDs._RayCountTexture, aoTraceResources.rayCountTexture); cmd.SetRayTracingTextureParam(aoTraceParameters.aoShaderRT, HDShaderIDs._AmbientOcclusionTextureRW, aoTraceResources.outputTexture); // Run the computation cmd.DispatchRays(aoTraceParameters.aoShaderRT, m_RayGenShaderName, (uint)aoTraceParameters.actualWidth, (uint)aoTraceParameters.actualHeight, (uint)aoTraceParameters.viewCount); }
public void RenderRTAO(HDCamera hdCamera, CommandBuffer cmd, RTHandle outputTexture, ShaderVariablesRaytracing globalCB, ScriptableRenderContext renderContext, int frameCount) { if (!m_RenderPipeline.GetRayTracingState()) { SetDefaultAmbientOcclusionTexture(cmd); return; } AmbientOcclusionTraceParameters aoTraceParameters = PrepareAmbientOcclusionTraceParameters(hdCamera, globalCB); AmbientOcclusionTraceResources aoTraceResources = PrepareAmbientOcclusionTraceResources(hdCamera, m_AOIntermediateBuffer0); // If any of the previous requirements is missing, the effect is not requested or no acceleration structure, set the default one and leave right away using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.RaytracingAmbientOcclusion))) { TraceAO(cmd, aoTraceParameters, aoTraceResources); } AmbientOcclusionDenoiseParameters aoDenoiseParameters = PrepareAmbientOcclusionDenoiseParameters(hdCamera, globalCB); AmbientOcclusionDenoiseResources aoDenoiserResources = PrepareAmbientOcclusionDenoiseResources(hdCamera, m_AOIntermediateBuffer0, m_AOIntermediateBuffer1, outputTexture); using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.RaytracingFilterAmbientOcclusion))) { DenoiseAO(cmd, hdCamera, aoDenoiseParameters, aoDenoiserResources); } AmbientOcclusionComposeParameters aoComposeParameters = PrepareAmbientOcclusionComposeParameters(hdCamera, globalCB); using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.RaytracingComposeAmbientOcclusion))) { ComposeAO(cmd, hdCamera, aoComposeParameters, outputTexture); } }
AmbientOcclusionTraceParameters PrepareAmbientOcclusionTraceParameters(HDCamera hdCamera, ShaderVariablesRaytracing raytracingCB) { AmbientOcclusionTraceParameters rtAOParameters = new AmbientOcclusionTraceParameters(); var aoSettings = hdCamera.volumeStack.GetComponent <AmbientOcclusion>(); // Camera data rtAOParameters.actualWidth = hdCamera.actualWidth; rtAOParameters.actualHeight = hdCamera.actualHeight; rtAOParameters.viewCount = hdCamera.viewCount; // Evaluation parameters rtAOParameters.rayLength = aoSettings.rayLength; rtAOParameters.sampleCount = aoSettings.sampleCount; rtAOParameters.denoise = aoSettings.denoise; // Other parameters rtAOParameters.raytracingCB = raytracingCB; rtAOParameters.aoShaderRT = m_PipelineRayTracingResources.aoRaytracingRT; rtAOParameters.rayTracingAccelerationStructure = m_RenderPipeline.RequestAccelerationStructure(); BlueNoise blueNoise = m_RenderPipeline.GetBlueNoiseManager(); rtAOParameters.ditheredTextureSet = blueNoise.DitheredTextureSet8SPP(); return(rtAOParameters); }
public void RenderRTAO(HDCamera hdCamera, CommandBuffer cmd, RTHandle outputTexture, ShaderVariablesRaytracing globalCB, ScriptableRenderContext renderContext, int frameCount) { if (!m_RenderPipeline.GetRayTracingState()) { SetDefaultAmbientOcclusionTexture(cmd); return; } AmbientOcclusionTraceParameters aoTraceParameters = PrepareAmbientOcclusionTraceParameters(hdCamera, globalCB); AmbientOcclusionTraceResources aoTraceResources = PrepareAmbientOcclusionTraceResources(hdCamera, m_AOIntermediateBuffer0); // If any of the previous requirements is missing, the effect is not requested or no acceleration structure, set the default one and leave right away using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.RaytracingAmbientOcclusion))) { TraceAO(cmd, aoTraceParameters, aoTraceResources); } using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.RaytracingFilterAmbientOcclusion))) { DenoiseAO(cmd, hdCamera, outputTexture); } AmbientOcclusionComposeParameters aoComposeParameters = PrepareAmbientOcclusionComposeParameters(hdCamera, globalCB); using (new ProfilingScope(cmd, ProfilingSampler.Get(HDProfileId.RaytracingComposeAmbientOcclusion))) { ComposeAO(cmd, aoComposeParameters, outputTexture); } // TODO: All the push-debug stuff should be centralized somewhere (RenderPipelineManager.currentPipeline as HDRenderPipeline).PushFullScreenDebugTexture(hdCamera, cmd, outputTexture, FullScreenDebugMode.ScreenSpaceAmbientOcclusion); }
AmbientOcclusionTraceParameters PrepareAmbientOcclusionTraceParameters(HDCamera hdCamera, ShaderVariablesRaytracing raytracingCB) { AmbientOcclusionTraceParameters rtAOParameters = new AmbientOcclusionTraceParameters(); var aoSettings = hdCamera.volumeStack.GetComponent <AmbientOcclusion>(); rtAOParameters.rayLength = aoSettings.rayLength; rtAOParameters.sampleCount = aoSettings.sampleCount; rtAOParameters.actualWidth = hdCamera.actualWidth; rtAOParameters.actualHeight = hdCamera.actualHeight; rtAOParameters.viewCount = hdCamera.viewCount; rtAOParameters.raytracingCB = raytracingCB; rtAOParameters.aoShaderRT = m_PipelineRayTracingResources.aoRaytracingRT; return(rtAOParameters); }