123 lines
4.0 KiB
C#
123 lines
4.0 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|