UnityGame/Library/PackageCache/com.unity.render-pipelines.universal/Runtime/RendererFeatures/RenderObjects.cs
2024-10-27 10:53:47 +03:00

249 lines
8.9 KiB
C#

using UnityEngine.Scripting.APIUpdating;
namespace UnityEngine.Rendering.Universal
{
/// <summary>
/// The queue type for the objects to render.
/// </summary>
[MovedFrom(true, "UnityEngine.Experimental.Rendering.Universal")]
public enum RenderQueueType
{
/// <summary>
/// Use this for opaque objects.
/// </summary>
Opaque,
/// <summary>
/// Use this for transparent objects.
/// </summary>
Transparent,
}
/// <summary>
/// The class for the render objects renderer feature.
/// </summary>
[ExcludeFromPreset]
[MovedFrom(true, "UnityEngine.Experimental.Rendering.Universal")]
[Tooltip("Render Objects simplifies the injection of additional render passes by exposing a selection of commonly used settings.")]
[URPHelpURL("renderer-features/renderer-feature-render-objects")]
public class RenderObjects : ScriptableRendererFeature
{
/// <summary>
/// Settings class used for the render objects renderer feature.
/// </summary>
[System.Serializable]
public class RenderObjectsSettings
{
/// <summary>
/// The profiler tag used with the pass.
/// </summary>
public string passTag = "RenderObjectsFeature";
/// <summary>
/// Controls when the render pass executes.
/// </summary>
public RenderPassEvent Event = RenderPassEvent.AfterRenderingOpaques;
/// <summary>
/// The filter settings for the pass.
/// </summary>
public FilterSettings filterSettings = new FilterSettings();
/// <summary>
/// The override material to use.
/// </summary>
public Material overrideMaterial = null;
/// <summary>
/// The pass index to use with the override material.
/// </summary>
public int overrideMaterialPassIndex = 0;
/// <summary>
/// The override shader to use.
/// </summary>
public Shader overrideShader = null;
/// <summary>
/// The pass index to use with the override shader.
/// </summary>
public int overrideShaderPassIndex = 0;
/// <summary>
/// Options to select which type of override mode should be used.
/// </summary>
public enum OverrideMaterialMode
{
/// <summary>
/// Use this to not override.
/// </summary>
None,
/// <summary>
/// Use this to use an override material.
/// </summary>
Material,
/// <summary>
/// Use this to use an override shader.
/// </summary>
Shader
};
/// <summary>
/// The selected override mode.
/// </summary>
public OverrideMaterialMode overrideMode = OverrideMaterialMode.Material; //default to Material as this was previously the only option
/// <summary>
/// Sets whether it should override depth or not.
/// </summary>
public bool overrideDepthState = false;
/// <summary>
/// The depth comparison function to use.
/// </summary>
public CompareFunction depthCompareFunction = CompareFunction.LessEqual;
/// <summary>
/// Sets whether it should write to depth or not.
/// </summary>
public bool enableWrite = true;
/// <summary>
/// The stencil settings to use.
/// </summary>
public StencilStateData stencilSettings = new StencilStateData();
/// <summary>
/// The camera settings to use.
/// </summary>
public CustomCameraSettings cameraSettings = new CustomCameraSettings();
}
/// <summary>
/// The filter settings used.
/// </summary>
[System.Serializable]
public class FilterSettings
{
// TODO: expose opaque, transparent, all ranges as drop down
/// <summary>
/// The queue type for the objects to render.
/// </summary>
public RenderQueueType RenderQueueType;
/// <summary>
/// The layer mask to use.
/// </summary>
public LayerMask LayerMask;
/// <summary>
/// The passes to render.
/// </summary>
public string[] PassNames;
/// <summary>
/// The constructor for the filter settings.
/// </summary>
public FilterSettings()
{
RenderQueueType = RenderQueueType.Opaque;
LayerMask = 0;
}
}
/// <summary>
/// The settings for custom cameras values.
/// </summary>
[System.Serializable]
public class CustomCameraSettings
{
/// <summary>
/// Used to mark whether camera values should be changed or not.
/// </summary>
public bool overrideCamera = false;
/// <summary>
/// Should the values be reverted after rendering the objects?
/// </summary>
public bool restoreCamera = true;
/// <summary>
/// Changes the camera offset.
/// </summary>
public Vector4 offset;
/// <summary>
/// Changes the camera field of view.
/// </summary>
public float cameraFieldOfView = 60.0f;
}
/// <summary>
/// The settings used for the Render Objects renderer feature.
/// </summary>
public RenderObjectsSettings settings = new RenderObjectsSettings();
RenderObjectsPass renderObjectsPass;
/// <inheritdoc/>
public override void Create()
{
FilterSettings filter = settings.filterSettings;
// Render Objects pass doesn't support events before rendering prepasses.
// The camera is not setup before this point and all rendering is monoscopic.
// Events before BeforeRenderingPrepasses should be used for input texture passes (shadow map, LUT, etc) that doesn't depend on the camera.
// These events are filtering in the UI, but we still should prevent users from changing it from code or
// by changing the serialized data.
if (settings.Event < RenderPassEvent.BeforeRenderingPrePasses)
settings.Event = RenderPassEvent.BeforeRenderingPrePasses;
renderObjectsPass = new RenderObjectsPass(settings.passTag, settings.Event, filter.PassNames,
filter.RenderQueueType, filter.LayerMask, settings.cameraSettings);
switch (settings.overrideMode)
{
case RenderObjectsSettings.OverrideMaterialMode.None:
renderObjectsPass.overrideMaterial = null;
renderObjectsPass.overrideShader = null;
break;
case RenderObjectsSettings.OverrideMaterialMode.Material:
renderObjectsPass.overrideMaterial = settings.overrideMaterial;
renderObjectsPass.overrideMaterialPassIndex = settings.overrideMaterialPassIndex;
renderObjectsPass.overrideShader = null;
break;
case RenderObjectsSettings.OverrideMaterialMode.Shader:
renderObjectsPass.overrideMaterial = null;
renderObjectsPass.overrideShader = settings.overrideShader;
renderObjectsPass.overrideShaderPassIndex = settings.overrideShaderPassIndex;
break;
}
if (settings.overrideDepthState)
renderObjectsPass.SetDepthState(settings.enableWrite, settings.depthCompareFunction);
if (settings.stencilSettings.overrideStencilState)
renderObjectsPass.SetStencilState(settings.stencilSettings.stencilReference,
settings.stencilSettings.stencilCompareFunction, settings.stencilSettings.passOperation,
settings.stencilSettings.failOperation, settings.stencilSettings.zFailOperation);
}
/// <inheritdoc/>
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
if (renderingData.cameraData.cameraType == CameraType.Preview
|| UniversalRenderer.IsOffscreenDepthTexture(ref renderingData.cameraData))
return;
renderer.EnqueuePass(renderObjectsPass);
}
internal override bool SupportsNativeRenderPass()
{
return true;
}
}
}