using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using Unity.Collections;
using UnityEngine.Scripting.APIUpdating;
using UnityEngine.Experimental.Rendering;
using UnityEngine.Rendering.RenderGraphModule;
namespace UnityEngine.Rendering.Universal
{
///
/// Input requirements for ScriptableRenderPass.
///
///
[Flags]
public enum ScriptableRenderPassInput
{
///
/// Used when a ScriptableRenderPass does not require any texture.
///
None = 0,
///
/// Used when a ScriptableRenderPass requires a depth texture.
///
Depth = 1 << 0,
///
/// Used when a ScriptableRenderPass requires a normal texture.
///
Normal = 1 << 1,
///
/// Used when a ScriptableRenderPass requires a color texture.
///
Color = 1 << 2,
///
/// Used when a ScriptableRenderPass requires a motion vectors texture.
///
Motion = 1 << 3,
}
// Note: Spaced built-in events so we can add events in between them
// We need to leave room as we sort render passes based on event.
// Users can also inject render pass events in a specific point by doing RenderPassEvent + offset
///
/// Controls when the render pass executes.
///
public enum RenderPassEvent
{
///
/// Executes a ScriptableRenderPass before rendering any other passes in the pipeline.
/// Camera matrices and stereo rendering are not setup this point.
/// You can use this to draw to custom input textures used later in the pipeline, f.ex LUT textures.
///
BeforeRendering = 0,
///
/// Executes a ScriptableRenderPass before rendering shadowmaps.
/// Camera matrices and stereo rendering are not setup this point.
///
BeforeRenderingShadows = 50,
///
/// Executes a ScriptableRenderPass after rendering shadowmaps.
/// Camera matrices and stereo rendering are not setup this point.
///
AfterRenderingShadows = 100,
///
/// Executes a ScriptableRenderPass before rendering prepasses, f.ex, depth prepass.
/// Camera matrices and stereo rendering are already setup at this point.
///
BeforeRenderingPrePasses = 150,
///
/// Executes a ScriptableRenderPass after rendering prepasses, f.ex, depth prepass.
/// Camera matrices and stereo rendering are already setup at this point.
///
AfterRenderingPrePasses = 200,
///
/// Executes a ScriptableRenderPass before rendering gbuffer pass.
///
BeforeRenderingGbuffer = 210,
///
/// Executes a ScriptableRenderPass after rendering gbuffer pass.
///
AfterRenderingGbuffer = 220,
///
/// Executes a ScriptableRenderPass before rendering deferred shading pass.
///
BeforeRenderingDeferredLights = 230,
///
/// Executes a ScriptableRenderPass after rendering deferred shading pass.
///
AfterRenderingDeferredLights = 240,
///
/// Executes a ScriptableRenderPass before rendering opaque objects.
///
BeforeRenderingOpaques = 250,
///
/// Executes a ScriptableRenderPass after rendering opaque objects.
///
AfterRenderingOpaques = 300,
///
/// Executes a ScriptableRenderPass before rendering the sky.
///
BeforeRenderingSkybox = 350,
///
/// Executes a ScriptableRenderPass after rendering the sky.
///
AfterRenderingSkybox = 400,
///
/// Executes a ScriptableRenderPass before rendering transparent objects.
///
BeforeRenderingTransparents = 450,
///
/// Executes a ScriptableRenderPass after rendering transparent objects.
///
AfterRenderingTransparents = 500,
///
/// Executes a ScriptableRenderPass before rendering post-processing effects.
///
BeforeRenderingPostProcessing = 550,
///
/// Executes a ScriptableRenderPass after rendering post-processing effects but before final blit, post-processing AA effects and color grading.
///
AfterRenderingPostProcessing = 600,
///
/// Executes a ScriptableRenderPass after rendering all effects.
///
AfterRendering = 1000,
}
///
/// Framebuffer fetch events in Universal RP
///
internal enum FramebufferFetchEvent
{
None = 0,
FetchGbufferInDeferred = 1
}
internal static class RenderPassEventsEnumValues
{
// we cache the values in this array at construction time to avoid runtime allocations, which we would cause if we accessed valuesInternal directly
public static int[] values;
static RenderPassEventsEnumValues()
{
System.Array valuesInternal = Enum.GetValues(typeof(RenderPassEvent));
values = new int[valuesInternal.Length];
int index = 0;
foreach (int value in valuesInternal)
{
values[index] = value;
index++;
}
}
}
///
/// ScriptableRenderPass implements a logical rendering pass that can be used to extend Universal RP renderer.
///
public abstract partial class ScriptableRenderPass: IRenderGraphRecorder
{
///
/// RTHandle alias for BuiltinRenderTextureType.CameraTarget which is the backbuffer.
///
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
public static RTHandle k_CameraTarget = RTHandles.Alloc(BuiltinRenderTextureType.CameraTarget);
///
/// The event when the render pass executes.
///
public RenderPassEvent renderPassEvent { get; set; }
///
/// The render target identifiers for color attachments.
/// This is obsolete, use colorAttachmentHandles instead.
///
[Obsolete("Use colorAttachmentHandles", true)]
public RenderTargetIdentifier[] colorAttachments => throw new NotSupportedException("colorAttachments has been deprecated. Use colorAttachmentHandles instead.");
///
/// The render target identifier for color attachment.
/// This is obsolete, use colorAttachmentHandle instead.
///
[Obsolete("Use colorAttachmentHandle", true)]
public RenderTargetIdentifier[] colorAttachment => throw new NotSupportedException("colorAttachment has been deprecated. Use colorAttachmentHandle instead.");
///
/// The render target identifier for depth attachment.
/// This is obsolete, use depthAttachmentHandle instead.
///
[Obsolete("Use depthAttachmentHandle", true)]
public RenderTargetIdentifier depthAttachment => throw new NotSupportedException("depthAttachment has been deprecated. Use depthAttachmentHandle instead.");
///
/// List for the g-buffer attachment handles.
///
public RTHandle[] colorAttachmentHandles => m_ColorAttachments;
///
/// The main color attachment handle.
///
public RTHandle colorAttachmentHandle => m_ColorAttachments[0];
///
/// The depth attachment handle.
///
public RTHandle depthAttachmentHandle => m_DepthAttachment;
///
/// The store actions for Color.
///
public RenderBufferStoreAction[] colorStoreActions => m_ColorStoreActions;
///
/// The store actions for Depth.
///
public RenderBufferStoreAction depthStoreAction => m_DepthStoreAction;
internal bool[] overriddenColorStoreActions => m_OverriddenColorStoreActions;
internal bool overriddenDepthStoreAction => m_OverriddenDepthStoreAction;
///
/// The input requirements for the ScriptableRenderPass, which has been set using ConfigureInput
///
///
public ScriptableRenderPassInput input => m_Input;
///
/// The flag to use when clearing.
///
///
public ClearFlag clearFlag => m_ClearFlag;
///
/// The color value to use when clearing.
///
public Color clearColor => m_ClearColor;
RenderBufferStoreAction[] m_ColorStoreActions = new RenderBufferStoreAction[] { RenderBufferStoreAction.Store };
RenderBufferStoreAction m_DepthStoreAction = RenderBufferStoreAction.Store;
///
/// Setting this property to true forces rendering of all passes in the URP frame via an intermediate texture. Use this option for passes that do not support rendering directly to the backbuffer or that require sampling the active color target. Using this option might have a significant performance impact on untethered VR platforms.
///
public bool requiresIntermediateTexture { get; set; }
// by default all store actions are Store. The overridden flags are used to keep track of explicitly requested store actions, to
// help figuring out the correct final store action for merged render passes when using the RenderPass API.
private bool[] m_OverriddenColorStoreActions = new bool[] { false };
private bool m_OverriddenDepthStoreAction = false;
private ProfilingSampler m_ProfingSampler;
private string m_PassName;
private RenderGraphSettings m_RenderGraphSettings;
///
/// A ProfilingSampler for the entire render pass. Used as a profiling name by ScriptableRenderer when executing the pass.
/// The default is named as the class type of the sub-class.
/// Set base.profilingSampler from the sub-class constructor to set a different profiling name for a custom ScriptableRenderPass
/// This returns null in release build (non-development)..
///
protected internal ProfilingSampler profilingSampler
{
get
{
//We only need this in release (non-dev build) but putting it here to track it in more test automation.
if (m_RenderGraphSettings == null)
{
m_RenderGraphSettings = GraphicsSettings.GetRenderPipelineSettings();
}
#if (DEVELOPMENT_BUILD || UNITY_EDITOR)
return m_ProfingSampler;
#else
//We only remove the sampler in release build when not in Compatibility Mode to avoid breaking user projects in the very unlikely scenario they would get the sampler.
return m_RenderGraphSettings.enableRenderCompatibilityMode ? m_ProfingSampler : null;
#endif
}
set
{
m_ProfingSampler = value;
m_PassName = (value != null) ? value.name : this.GetType().Name;
}
}
///
/// The name of the pass that will show up in profiler and other tools. This will be indentical to the
/// name of profilingSampler. profilingSampler is set to null in the release build (non-development)
/// so this passName property is the safe way to access the name and use it consistently. This will always return a valid string.
///
protected internal string passName{ get { return m_PassName; } }
internal bool overrideCameraTarget { get; set; }
internal bool isBlitRenderPass { get; set; }
internal bool useNativeRenderPass { get; set; }
internal bool breakGBufferAndDeferredRenderPass { get; set; }
// index to track the position in the current frame
internal int renderPassQueueIndex { get; set; }
internal NativeArray m_ColorAttachmentIndices;
internal NativeArray m_InputAttachmentIndices;
internal GraphicsFormat[] renderTargetFormat { get; set; }
RTHandle[] m_ColorAttachments;
internal RTHandle[] m_InputAttachments = new RTHandle[8];
internal bool[] m_InputAttachmentIsTransient = new bool[8];
RTHandle m_DepthAttachment;
ScriptableRenderPassInput m_Input = ScriptableRenderPassInput.None;
ClearFlag m_ClearFlag = ClearFlag.None;
Color m_ClearColor = Color.black;
static internal DebugHandler GetActiveDebugHandler(UniversalCameraData cameraData)
{
var debugHandler = cameraData.renderer.DebugHandler;
if ((debugHandler != null) && debugHandler.IsActiveForCamera(cameraData.isPreviewCamera))
return debugHandler;
return null;
}
///
/// Creates a new ScriptableRenderPass" instance.
///
public ScriptableRenderPass()
{
renderPassEvent = RenderPassEvent.AfterRenderingOpaques;
// Disable obsolete warning for internal usage
#pragma warning disable CS0618
m_ColorAttachments = new RTHandle[] { k_CameraTarget, null, null, null, null, null, null, null };
m_DepthAttachment = k_CameraTarget;
#pragma warning restore CS0618
m_InputAttachments = new RTHandle[] { null, null, null, null, null, null, null, null };
m_InputAttachmentIsTransient = new bool[] { false, false, false, false, false, false, false, false };
m_ColorStoreActions = new RenderBufferStoreAction[] { RenderBufferStoreAction.Store, 0, 0, 0, 0, 0, 0, 0 };
m_DepthStoreAction = RenderBufferStoreAction.Store;
m_OverriddenColorStoreActions = new bool[] { false, false, false, false, false, false, false, false };
m_OverriddenDepthStoreAction = false;
m_ClearFlag = ClearFlag.None;
m_ClearColor = Color.black;
overrideCameraTarget = false;
isBlitRenderPass = false;
useNativeRenderPass = true;
breakGBufferAndDeferredRenderPass = true;
renderPassQueueIndex = -1;
renderTargetFormat = new GraphicsFormat[]
{
GraphicsFormat.None, GraphicsFormat.None, GraphicsFormat.None,
GraphicsFormat.None, GraphicsFormat.None, GraphicsFormat.None, GraphicsFormat.None, GraphicsFormat.None
};
profilingSampler = new ProfilingSampler(this.GetType().Name);
}
///
/// Configures Input Requirements for this render pass.
/// This method should be called inside ScriptableRendererFeature.AddRenderPasses.
///
/// ScriptableRenderPassInput containing information about what requirements the pass needs.
///
public void ConfigureInput(ScriptableRenderPassInput passInput)
{
m_Input = passInput;
}
///
/// Configures the Store Action for a color attachment of this render pass.
///
/// RenderBufferStoreAction to use
/// Index of the color attachment
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
public void ConfigureColorStoreAction(RenderBufferStoreAction storeAction, uint attachmentIndex = 0)
{
m_ColorStoreActions[attachmentIndex] = storeAction;
m_OverriddenColorStoreActions[attachmentIndex] = true;
}
///
/// Configures the Store Actions for all the color attachments of this render pass.
///
/// Array of RenderBufferStoreActions to use
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
public void ConfigureColorStoreActions(RenderBufferStoreAction[] storeActions)
{
int count = Math.Min(storeActions.Length, m_ColorStoreActions.Length);
for (uint i = 0; i < count; ++i)
{
m_ColorStoreActions[i] = storeActions[i];
m_OverriddenColorStoreActions[i] = true;
}
}
///
/// Configures the Store Action for the depth attachment of this render pass.
///
/// RenderBufferStoreAction to use
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
public void ConfigureDepthStoreAction(RenderBufferStoreAction storeAction)
{
m_DepthStoreAction = storeAction;
m_OverriddenDepthStoreAction = true;
}
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
internal void ConfigureInputAttachments(RTHandle input, bool isTransient = false)
{
m_InputAttachments[0] = input;
m_InputAttachmentIsTransient[0] = isTransient;
}
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
internal void ConfigureInputAttachments(RTHandle[] inputs)
{
m_InputAttachments = inputs;
}
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
internal void ConfigureInputAttachments(RTHandle[] inputs, bool[] isTransient)
{
// Disable obsolete warning for internal usage
#pragma warning disable CS0618
ConfigureInputAttachments(inputs);
#pragma warning restore CS0618
m_InputAttachmentIsTransient = isTransient;
}
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
internal void SetInputAttachmentTransient(int idx, bool isTransient)
{
m_InputAttachmentIsTransient[idx] = isTransient;
}
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
internal bool IsInputAttachmentTransient(int idx)
{
return m_InputAttachmentIsTransient[idx];
}
///
/// Resets render targets to default.
/// This method effectively reset changes done by ConfigureTarget.
///
///
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
public void ResetTarget()
{
overrideCameraTarget = false;
// Reset depth
m_DepthAttachment = null;
// Reset colors
m_ColorAttachments[0] = null;
for (int i = 1; i < m_ColorAttachments.Length; ++i)
{
m_ColorAttachments[i] = null;
}
}
///
/// Configures render targets for this render pass. Call this instead of CommandBuffer.SetRenderTarget.
/// This method should be called inside Configure.
///
/// Color attachment identifier.
/// Depth attachment identifier.
///
[Obsolete("Use RTHandles for colorAttachment and depthAttachment", true)]
public void ConfigureTarget(RenderTargetIdentifier colorAttachment, RenderTargetIdentifier depthAttachment)
{
throw new NotSupportedException("ConfigureTarget with RenderTargetIdentifier has been deprecated. Use RTHandles instead");
}
///
/// Configures render targets for this render pass. Call this instead of CommandBuffer.SetRenderTarget.
/// This method should be called inside Configure.
///
/// Color attachment handle.
/// Depth attachment handle.
///
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
public void ConfigureTarget(RTHandle colorAttachment, RTHandle depthAttachment)
{
overrideCameraTarget = true;
m_DepthAttachment = depthAttachment;
m_ColorAttachments[0] = colorAttachment;
for (int i = 1; i < m_ColorAttachments.Length; ++i)
{
m_ColorAttachments[i] = null;
}
}
///
/// Configures render targets for this render pass. Call this instead of CommandBuffer.SetRenderTarget.
/// This method should be called inside Configure.
///
/// Color attachment identifier.
/// Depth attachment identifier.
///
[Obsolete("Use RTHandles for colorAttachments and depthAttachment", true)]
public void ConfigureTarget(RenderTargetIdentifier[] colorAttachments, RenderTargetIdentifier depthAttachment)
{
throw new NotSupportedException("ConfigureTarget with RenderTargetIdentifier has been deprecated. Use it with RTHandles instead");
}
///
/// Configures render targets for this render pass. Call this instead of CommandBuffer.SetRenderTarget.
/// This method should be called inside Configure.
///
/// Color attachment handle.
/// Depth attachment handle.
///
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
public void ConfigureTarget(RTHandle[] colorAttachments, RTHandle depthAttachment)
{
overrideCameraTarget = true;
uint nonNullColorBuffers = RenderingUtils.GetValidColorBufferCount(colorAttachments);
if (nonNullColorBuffers > SystemInfo.supportedRenderTargetCount)
Debug.LogError("Trying to set " + nonNullColorBuffers + " renderTargets, which is more than the maximum supported:" + SystemInfo.supportedRenderTargetCount);
if (colorAttachments.Length > m_ColorAttachments.Length)
Debug.LogError("Trying to set " + colorAttachments.Length + " color attachments, which is more than the maximum supported:" + m_ColorAttachments.Length);
for (int i = 0; i < colorAttachments.Length; ++i)
{
m_ColorAttachments[i] = colorAttachments[i];
}
for (int i = colorAttachments.Length; i < m_ColorAttachments.Length; ++i)
{
m_ColorAttachments[i] = null;
}
m_DepthAttachment = depthAttachment;
}
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
internal void ConfigureTarget(RTHandle[] colorAttachments, RTHandle depthAttachment, GraphicsFormat[] formats)
{
// Disable obsolete warning for internal usage
#pragma warning disable CS0618
ConfigureTarget(colorAttachments, depthAttachment);
#pragma warning restore CS0618
for (int i = 0; i < formats.Length; ++i)
renderTargetFormat[i] = formats[i];
}
///
/// Configures render targets for this render pass. Call this instead of CommandBuffer.SetRenderTarget.
/// This method should be called inside Configure.
///
/// Color attachment identifier.
///
[Obsolete("Use RTHandle for colorAttachment", true)]
public void ConfigureTarget(RenderTargetIdentifier colorAttachment)
{
throw new NotSupportedException("ConfigureTarget with RenderTargetIdentifier has been deprecated. Use it with RTHandles instead");
}
///
/// Configures render targets for this render pass. Call this instead of CommandBuffer.SetRenderTarget.
/// This method should be called inside Configure.
///
/// Color attachment handle.
///
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
public void ConfigureTarget(RTHandle colorAttachment)
{
// Disable obsolete warning for internal usage
#pragma warning disable CS0618
ConfigureTarget(colorAttachment, k_CameraTarget);
#pragma warning restore CS0618
}
///
/// Configures render targets for this render pass. Call this instead of CommandBuffer.SetRenderTarget.
/// This method should be called inside Configure.
///
/// Color attachment identifiers.
///
[Obsolete("Use RTHandles for colorAttachments", true)]
public void ConfigureTarget(RenderTargetIdentifier[] colorAttachments)
{
throw new NotSupportedException("ConfigureTarget with RenderTargetIdentifier has been deprecated. Use it with RTHandles instead");
}
///
/// Configures render targets for this render pass. Call this instead of CommandBuffer.SetRenderTarget.
/// This method should be called inside Configure.
///
/// Color attachment handle.
///
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
public void ConfigureTarget(RTHandle[] colorAttachments)
{
// Disable obsolete warning for internal usage
#pragma warning disable CS0618
ConfigureTarget(colorAttachments, k_CameraTarget);
#pragma warning restore CS0618
}
///
/// Configures clearing for the render targets for this render pass. Call this inside Configure.
///
/// ClearFlag containing information about what targets to clear.
/// Clear color.
///
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
public void ConfigureClear(ClearFlag clearFlag, Color clearColor)
{
m_ClearFlag = clearFlag;
m_ClearColor = clearColor;
}
///
/// This method is called by the renderer before rendering a camera
/// Override this method if you need to to configure render targets and their clear state, and to create temporary render target textures.
/// If a render pass doesn't override this method, this render pass renders to the active Camera's render target.
/// You should never call CommandBuffer.SetRenderTarget. Instead call ConfigureTarget and ConfigureClear.
///
/// CommandBuffer to enqueue rendering commands. This will be executed by the pipeline.
/// Current rendering state information
///
///
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
public virtual void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
{ }
///
/// This method is called by the renderer before executing the render pass.
/// Override this method if you need to to configure render targets and their clear state, and to create temporary render target textures.
/// If a render pass doesn't override this method, this render pass renders to the active Camera's render target.
/// You should never call CommandBuffer.SetRenderTarget. Instead call ConfigureTarget and ConfigureClear.
///
/// CommandBuffer to enqueue rendering commands. This will be executed by the pipeline.
/// Render texture descriptor of the camera render target.
///
///
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
public virtual void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
{ }
///
/// Called upon finish rendering a camera. You can use this callback to release any resources created
/// by this render
/// pass that need to be cleanup once camera has finished rendering.
/// This method should be called for all cameras in a camera stack.
///
/// Use this CommandBuffer to cleanup any generated data
public virtual void OnCameraCleanup(CommandBuffer cmd)
{
}
///
/// Called upon finish rendering a camera stack. You can use this callback to release any resources created
/// by this render pass that need to be cleanup once all cameras in the stack have finished rendering.
/// This method will be called once after rendering the last camera in the camera stack.
/// Cameras that don't have an explicit camera stack are also considered stacked rendering.
/// In that case the Base camera is the first and last camera in the stack.
///
/// Use this CommandBuffer to cleanup any generated data
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
public virtual void OnFinishCameraStackRendering(CommandBuffer cmd)
{ }
///
/// Execute the pass. This is where custom rendering occurs. Specific details are left to the implementation
///
/// Use this render context to issue any draw commands during execution
/// Current rendering state information
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
public virtual void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
Debug.LogWarning("Execute is not implemented, the pass " + this.ToString() + " won't be executed in the current render loop.");
}
///
public virtual void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
{
Debug.LogWarning("The render pass " + this.ToString() + " does not have an implementation of the RecordRenderGraph method. Please implement this method, or consider turning on Compatibility Mode (RenderGraph disabled) in the menu Edit > Project Settings > Graphics > URP. Otherwise the render pass will have no effect. For more information, refer to https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@latest/index.html?subfolder=/manual/customizing-urp.html.");
}
///
/// Add a blit command to the context for execution. This changes the active render target in the ScriptableRenderer to
/// destination.
///
/// Command buffer to record command for execution.
/// Source texture or target identifier to blit from.
/// Destination texture or target identifier to blit into. This becomes the renderer active render target.
/// Material to use.
/// Shader pass to use. Default is 0.
///
[Obsolete("Use RTHandles for source and destination", true)]
public void Blit(CommandBuffer cmd, RenderTargetIdentifier source, RenderTargetIdentifier destination, Material material = null, int passIndex = 0)
{
throw new NotSupportedException("Blit with RenderTargetIdentifier has been deprecated. Use RTHandles instead");
}
///
/// Add a blit command to the context for execution. This changes the active render target in the ScriptableRenderer to
/// destination.
///
/// Command buffer to record command for execution.
/// Source texture or target handle to blit from.
/// Destination texture or target handle to blit into. This becomes the renderer active render target.
/// Material to use.
/// Shader pass to use. Default is 0.
///
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
public void Blit(CommandBuffer cmd, RTHandle source, RTHandle destination, Material material = null, int passIndex = 0)
{
if (material == null)
Blitter.BlitCameraTexture(cmd, source, destination, bilinear: source.rt.filterMode == FilterMode.Bilinear);
else
Blitter.BlitCameraTexture(cmd, source, destination, material, passIndex);
}
///
/// Add a blit command to the context for execution. This applies the material to the color target.
///
/// Command buffer to record command for execution.
/// RenderingData to access the active renderer.
/// Material to use.
/// Shader pass to use. Default is 0.
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
public void Blit(CommandBuffer cmd, ref RenderingData data, Material material, int passIndex = 0)
{
var renderer = data.cameraData.renderer;
Blit(cmd, renderer.cameraColorTargetHandle, renderer.GetCameraColorFrontBuffer(cmd), material, passIndex);
renderer.SwapColorBuffer(cmd);
}
///
/// Add a blit command to the context for execution. This applies the material to the color target.
///
/// Command buffer to record command for execution.
/// RenderingData to access the active renderer.
/// Source texture or target identifier to blit from.
/// Material to use.
/// Shader pass to use. Default is 0.
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
public void Blit(CommandBuffer cmd, ref RenderingData data, RTHandle source, Material material, int passIndex = 0)
{
var renderer = data.cameraData.renderer;
Blit(cmd, source, renderer.cameraColorTargetHandle, material, passIndex);
}
///
/// Creates DrawingSettings based on current the rendering state.
///
/// Shader pass tag to render.
/// Current rendering state.
/// Criteria to sort objects being rendered.
/// Returns the draw settings created.
///
public DrawingSettings CreateDrawingSettings(ShaderTagId shaderTagId, ref RenderingData renderingData, SortingCriteria sortingCriteria)
{
ContextContainer frameData = renderingData.frameData;
UniversalRenderingData universalRenderingData = frameData.Get();
UniversalCameraData cameraData = frameData.Get();
UniversalLightData lightData = frameData.Get();
return RenderingUtils.CreateDrawingSettings(shaderTagId, universalRenderingData, cameraData, lightData, sortingCriteria);
}
///
/// Creates DrawingSettings based on current the rendering state.
///
/// Shader pass tag to render.
/// Current rendering state.
/// Current camera state.
/// Current light state.
/// Criteria to sort objects being rendered.
/// Returns the draw settings created.
///
public DrawingSettings CreateDrawingSettings(ShaderTagId shaderTagId, UniversalRenderingData renderingData,
UniversalCameraData cameraData, UniversalLightData lightData, SortingCriteria sortingCriteria)
{
return RenderingUtils.CreateDrawingSettings(shaderTagId, renderingData, cameraData, lightData, sortingCriteria);
}
///
/// Creates DrawingSettings based on current rendering state.
///
/// List of shader pass tag to render.
/// Current rendering state.
/// Criteria to sort objects being rendered.
/// Returns the draw settings created.
///
public DrawingSettings CreateDrawingSettings(List shaderTagIdList,
ref RenderingData renderingData, SortingCriteria sortingCriteria)
{
ContextContainer frameData = renderingData.frameData;
UniversalRenderingData universalRenderingData = frameData.Get();
UniversalCameraData cameraData = frameData.Get();
UniversalLightData lightData = frameData.Get();
return RenderingUtils.CreateDrawingSettings(shaderTagIdList, universalRenderingData, cameraData, lightData, sortingCriteria);
}
///
/// Creates DrawingSettings based on current rendering state.
///
/// List of shader pass tag to render.
/// Current rendering state.
/// Current camera state.
/// Current light state.
/// Criteria to sort objects being rendered.
/// Returns the draw settings created.
///
public DrawingSettings CreateDrawingSettings(List shaderTagIdList,
UniversalRenderingData renderingData, UniversalCameraData cameraData,
UniversalLightData lightData, SortingCriteria sortingCriteria)
{
return RenderingUtils.CreateDrawingSettings(shaderTagIdList, renderingData, cameraData, lightData, sortingCriteria);
}
///
/// Compares two instances of ScriptableRenderPass by their RenderPassEvent and returns if is executed before .
///
///
///
///
public static bool operator <(ScriptableRenderPass lhs, ScriptableRenderPass rhs)
{
return lhs.renderPassEvent < rhs.renderPassEvent;
}
///
/// Compares two instances of ScriptableRenderPass by their RenderPassEvent and returns if is executed after .
///
///
///
///
public static bool operator >(ScriptableRenderPass lhs, ScriptableRenderPass rhs)
{
return lhs.renderPassEvent > rhs.renderPassEvent;
}
static internal int GetRenderPassEventRange(RenderPassEvent renderPassEvent)
{
int numEvents = RenderPassEventsEnumValues.values.Length;
int currentIndex = 0;
// find the index of the renderPassEvent in the values array
for(int i = 0; i < numEvents; ++i)
{
if (RenderPassEventsEnumValues.values[currentIndex] == (int)renderPassEvent)
break;
currentIndex++;
}
if (currentIndex >= numEvents)
{
Debug.LogError("GetRenderPassEventRange: invalid renderPassEvent value cannot be found in the RenderPassEvent enumeration");
return 0;
}
if (currentIndex + 1 >= numEvents)
return 50; // if this was the last event in the enum, then add 50 as the range
int nextValue = RenderPassEventsEnumValues.values[currentIndex + 1];
return nextValue - (int) renderPassEvent;
}
}
}