UnityGame/Library/PackageCache/com.unity.render-pipelines.universal/Runtime/History/RawDepthHistory.cs

123 lines
4.0 KiB
C#
Raw Normal View History

2024-10-27 10:53:47 +03:00
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.depthStencilFormat != GraphicsFormat.None || cameraDesc.graphicsFormat != GraphicsFormat.None) )
{
var historyDesc = GetHistoryDescriptor(ref cameraDesc);
if (IsDirty(ref historyDesc))
Reset();
if (!IsAllocated())
{
Alloc(ref historyDesc, xrMultipassEnabled);
return true;
}
}
return false;
}
}
}