123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- using System;
- using UnityEngine.Experimental.Rendering;
-
- namespace UnityEngine.Rendering.Universal
- {
- /// <summary>
- /// Raw render depth history. The depth snapshot is taken before post processing.
- /// A matching color is RawColorHistory.
- /// Format is the camera depth format or R32Float on platforms with limitations.
- /// If TemporalAA is enabled the depth is jittered.
- /// No mips. No depth pyramid.
- /// MSAA is not supported and is resolved for the history.
- /// XR is supported.
- /// </summary>
- public sealed class RawDepthHistory : CameraHistoryItem
- {
- private int[] m_Ids = new int[2];
- private static readonly string[] m_Names = new[]
- {
- "RawDepthHistory0",
- "RawDepthHistory1"
- };
- private RenderTextureDescriptor m_Descriptor;
- private Hash128 m_DescKey;
-
- /// <inheritdoc />
- public override void OnCreate(BufferedRTHandleSystem owner, uint typeId)
- {
- base.OnCreate(owner, typeId);
- m_Ids[0] = MakeId(0);
- m_Ids[1] = MakeId(1);
- }
-
- /// <summary>
- /// Get the current history texture.
- /// Current history might not be valid yet. It is valid only after executing the producing render pass.
- /// </summary>
- /// <param name="eyeIndex">Eye index, typically XRPass.multipassId.</param>
- /// <returns>The texture.</returns>
- public RTHandle GetCurrentTexture(int eyeIndex = 0)
- {
- if ((uint)eyeIndex >= m_Ids.Length)
- return null;
-
- return GetCurrentFrameRT(m_Ids[eyeIndex]);
- }
-
- /// <summary>
- /// Get the previous history texture.
- /// </summary>
- /// <param name="eyeIndex">Eye index, typically XRPass.multipassId.</param>
- /// <returns>The texture.</returns>
- public RTHandle GetPreviousTexture(int eyeIndex = 0)
- {
- if ((uint)eyeIndex >= m_Ids.Length)
- return null;
-
- return GetPreviousFrameRT(m_Ids[eyeIndex]);
- }
-
- private bool IsAllocated()
- {
- return GetCurrentTexture() != null;
- }
-
- // True if the desc changed, graphicsFormat etc.
- private bool IsDirty(ref RenderTextureDescriptor desc)
- {
- return m_DescKey != Hash128.Compute(ref desc);
- }
-
- private void Alloc(ref RenderTextureDescriptor desc, bool xrMultipassEnabled)
- {
- // Generic type, we need double buffering.
- AllocHistoryFrameRT(m_Ids[0], 2, ref desc, m_Names[0]);
-
- if(xrMultipassEnabled)
- AllocHistoryFrameRT(m_Ids[1], 2, ref desc, m_Names[1]);
-
- m_Descriptor = desc;
- m_DescKey = Hash128.Compute(ref desc);
- }
-
- /// <summary>
- /// Release the history texture(s).
- /// </summary>
- public override void Reset()
- {
- for(int i = 0; i < m_Ids.Length; i++)
- ReleaseHistoryFrameRT(m_Ids[i]);
- }
-
- internal RenderTextureDescriptor GetHistoryDescriptor(ref RenderTextureDescriptor cameraDesc)
- {
- var depthDesc = cameraDesc;
- depthDesc.mipCount = 0;
- depthDesc.msaaSamples = 1; // History copy should not have MSAA.
-
- return depthDesc;
- }
-
- // Return true if the RTHandles were reallocated.
- internal bool Update(ref RenderTextureDescriptor cameraDesc, bool xrMultipassEnabled)
- {
- if (cameraDesc.width > 0 && cameraDesc.height > 0 && cameraDesc.graphicsFormat != GraphicsFormat.None)
- {
- var historyDesc = GetHistoryDescriptor(ref cameraDesc);
-
- if (IsDirty(ref historyDesc))
- Reset();
-
- if (!IsAllocated())
- {
- Alloc(ref historyDesc, xrMultipassEnabled);
- return true;
- }
- }
-
- return false;
- }
- }
- }
|