#if ENABLE_PATH_TRACING_SRP using System; using UnityEngine.PathTracing.Core; namespace UnityEngine.Rendering.LiveGI { internal class RayTracingRenderPipelineInstance : RenderPipeline { // Use this variable to a reference to the Render Pipeline Asset that was passed to the constructor private RayTracingRenderPipelineAsset renderPipelineAsset; private PathTracingContext ptContext; public RayTracingRenderPipelineInstance(RayTracingRenderPipelineAsset asset) { renderPipelineAsset = asset; ptContext = new PathTracingContext(PathTracingOutput.FullPathTracer); var resources = Util.LoadOrCreateRayTracingResources(); if (resources != null) { var activeBackend = ptContext.SelectRayTracingBackend(renderPipelineAsset.settings.raytracingBackend, resources); // Set the active backend, in case we request an unsuported backend and fallback to another one renderPipelineAsset.settings.raytracingBackend = activeBackend; } } protected override void Dispose(bool disposing) { ptContext?.Dispose(); } [Obsolete] protected override void Render(ScriptableRenderContext context, Camera[] cameras) { using var cmd = new CommandBuffer(); cmd.name = "Path Tracing Command Buffer"; ptContext.Update(cmd, renderPipelineAsset.settings); // Iterate over all Cameras foreach (Camera camera in cameras) { // Update the value of built-in shader variables, based on the current Camera context.SetupCameraProperties(camera); var additionalData = camera.GetComponent(); if (additionalData == null) { additionalData = camera.gameObject.AddComponent(); additionalData.hideFlags = HideFlags.DontSave; // Don't show this in inspector } additionalData.CreatePersistentResources(camera, renderPipelineAsset.settings.denoising); Vector4 frustum = PathTracingContext.GetCameraFrustum(camera); // Render the path tracing into the camera's target texture var scaledSize = additionalData.rayTracingOutput.GetScaledSize(); ptContext.Render(cmd, scaledSize, frustum, camera.cameraToWorldMatrix, camera.worldToCameraMatrix, camera.projectionMatrix, additionalData.previousViewProjection, renderPipelineAsset.settings, additionalData.rayTracingOutput, additionalData.normals, additionalData.motionVectors, additionalData.debugOutput, additionalData.frameIndex); var viewProjection = camera.projectionMatrix * camera.worldToCameraMatrix; ptContext.Denoise(cmd,additionalData.denoiser, camera.nearClipPlane, camera.farClipPlane, viewProjection, renderPipelineAsset.settings, additionalData.rayTracingOutput, additionalData.normals, additionalData.motionVectors); additionalData.UpdateCameraDataPostRender(camera); // Blit the path traced frame to the active camera texture // Note: we could not render to this directly, as it might not have the required UAV flags cmd.Blit(additionalData.rayTracingOutput, camera.activeTexture); // Instruct the graphics API to perform all scheduled commands context.ExecuteCommandBuffer(cmd); } context.Submit(); } } } #endif