using System;
using System.Collections.Generic;
using UnityEngine.Profiling;
namespace UnityEngine.Rendering.Universal.Internal
{
///
/// Draw motion vectors into the given color and depth target. Both come from the Oculus runtime.
///
/// This will render objects that have a material and/or shader with the pass name "MotionVectors".
///
public class OculusMotionVectorPass : ScriptableRenderPass
{
FilteringSettings m_FilteringSettings;
ProfilingSampler m_ProfilingSampler;
RenderTargetIdentifier motionVectorColorIdentifier;
RenderTargetIdentifier motionVectorDepthIdentifier;
public OculusMotionVectorPass(string profilerTag, bool opaque, RenderPassEvent evt, RenderQueueRange renderQueueRange, LayerMask layerMask, StencilState stencilState, int stencilReference)
{
base.profilingSampler = new ProfilingSampler(nameof(OculusMotionVectorPass));
m_ProfilingSampler = new ProfilingSampler(profilerTag);
renderPassEvent = evt;
m_FilteringSettings = new FilteringSettings(renderQueueRange, layerMask);
}
internal OculusMotionVectorPass(URPProfileId profileId, bool opaque, RenderPassEvent evt, RenderQueueRange renderQueueRange, LayerMask layerMask, StencilState stencilState, int stencilReference)
: this(profileId.GetType().Name, opaque, evt, renderQueueRange, layerMask, stencilState, stencilReference)
{
m_ProfilingSampler = ProfilingSampler.Get(profileId);
}
public void Setup(
RenderTargetIdentifier motionVecColorIdentifier,
RenderTargetIdentifier motionVecDepthIdentifier)
{
this.motionVectorColorIdentifier = motionVecColorIdentifier;
this.motionVectorDepthIdentifier = motionVecDepthIdentifier;
}
public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
{
ConfigureTarget(motionVectorColorIdentifier, motionVectorDepthIdentifier);
ConfigureClear(ClearFlag.All, Color.black);
}
///
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
// NOTE: Do NOT mix ProfilingScope with named CommandBuffers i.e. CommandBufferPool.Get("name").
// Currently there's an issue which results in mismatched markers.
CommandBuffer cmd = CommandBufferPool.Get();
using (new ProfilingScope(cmd, m_ProfilingSampler))
{
context.ExecuteCommandBuffer(cmd);
cmd.Clear();
Camera camera = renderingData.cameraData.camera;
var filterSettings = m_FilteringSettings;
var drawSettings = CreateDrawingSettings(new ShaderTagId("MotionVectors"), ref renderingData, renderingData.cameraData.defaultOpaqueSortFlags);
drawSettings.perObjectData = PerObjectData.MotionVectors;
context.DrawRenderers(renderingData.cullResults, ref drawSettings, ref filterSettings);
}
context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
}
}
}