249 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			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; | ||
|  |         } | ||
|  |     } | ||
|  | } |