#if ENABLE_PATH_TRACING_SRP using UnityEngine.Rendering.Denoising; using UnityEngine.Experimental.Rendering; namespace UnityEngine.Rendering.LiveGI { internal class AdditionalCameraData : MonoBehaviour { [Header("Viewport Settings")] [Range(50, 100)] public uint scale = 100; [HideInInspector] public Matrix4x4 previousViewProjection; [HideInInspector] public int frameIndex; [HideInInspector] public RTHandle rayTracingOutput = null; [HideInInspector] public RTHandle normals = null; [HideInInspector] public RTHandle motionVectors = null; [HideInInspector] public RTHandle debugOutput = null; public CommandBufferDenoiser denoiser = null; // TODO: Use 32-bit float formats because they are required by the neural network denoising backends. GraphicsFormat bufferFormat = GraphicsFormat.R32G32B32A32_SFloat; //GraphicsFormat bufferFormat = GraphicsFormat.R16G16B16A16_SFloat; // Start is called before the first frame update void Start() { frameIndex = 0; previousViewProjection = Matrix4x4.identity; } // Update is called once per frame void Update() { } public void UpdateCameraDataPostRender(Camera camera) { previousViewProjection = camera.projectionMatrix * camera.worldToCameraMatrix; frameIndex++; } public void GetScaledViewport(Camera camera, out int scaledWidth, out int scaledHeight) { scaledWidth = Mathf.RoundToInt(camera.pixelWidth * scale / 100.0f); scaledHeight = Mathf.RoundToInt(camera.pixelHeight * scale / 100.0f); // Make sure the scaled viewport size is a multiple of 8 //scaledWidth = (scaledWidth / 8) * 8; //scaledHeight = (scaledHeight / 8) * 8; } public void CreatePersistentResources(Camera camera, DenoiserType requestedDenoiser) { int scaledWidth = 0; int scaledHeight = 0; GetScaledViewport(camera, out scaledWidth, out scaledHeight); RTHandles.SetReferenceSize(scaledWidth, scaledHeight); if (rayTracingOutput == null) { RTHandles.ResetReferenceSize(scaledWidth, scaledHeight); rayTracingOutput = RTHandles.Alloc(Vector2.one, 1, DepthBits.None, bufferFormat, FilterMode.Point, TextureWrapMode.Repeat, TextureDimension.Tex2D, true, name: "Path tracing render target"); normals = RTHandles.Alloc(Vector2.one, 1, DepthBits.None, bufferFormat, FilterMode.Point, TextureWrapMode.Repeat, TextureDimension.Tex2D, true, name: "Path tracing normal AOV"); motionVectors = RTHandles.Alloc(Vector2.one, 1, DepthBits.None, bufferFormat, FilterMode.Point, TextureWrapMode.Repeat, TextureDimension.Tex2D, true, name: "Path tracing motion vectors"); debugOutput = RTHandles.Alloc(Vector2.one, 1, DepthBits.None, bufferFormat, FilterMode.Point, TextureWrapMode.Repeat, TextureDimension.Tex2D, true, name: "Path tracing debug output"); // when we (re)create the output buffer, reset the iteration for the camera frameIndex = 0; // for the first frame we don't have view projection history, so use current camera previousViewProjection = camera.projectionMatrix * camera.worldToCameraMatrix; } if (denoiser == null || denoiser.type != requestedDenoiser) { denoiser = new CommandBufferDenoiser(); } denoiser.Init(requestedDenoiser, scaledWidth, scaledHeight); } public void ReleaseRTHandles() { if (rayTracingOutput != null) { rayTracingOutput.Release(); rayTracingOutput = null; } if (normals != null) { normals.Release(); normals = null; } if (motionVectors != null) { motionVectors.Release(); motionVectors = null; } } void OnDestroy() { ReleaseRTHandles(); } } } #endif