From b74f7207d741f29294a1dcc16272c0f07ac35f3c Mon Sep 17 00:00:00 2001 From: Peter Bay Bastian Date: Wed, 6 Oct 2021 15:13:09 +0200 Subject: [PATCH 1/2] Add camera type mask to Render Objects --- .../Documentation~/urp-renderer-feature.md | 1 + .../RenderObjectsPassFeatureEditor.cs | 6 ++ .../Runtime/CameraTypeMask.cs | 56 +++++++++++++++++++ .../Runtime/CameraTypeMask.cs.meta | 11 ++++ .../Runtime/Passes/RenderObjectsPass.cs | 7 ++- .../Runtime/RendererFeatures/RenderObjects.cs | 6 +- 6 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 com.unity.render-pipelines.universal/Runtime/CameraTypeMask.cs create mode 100644 com.unity.render-pipelines.universal/Runtime/CameraTypeMask.cs.meta diff --git a/com.unity.render-pipelines.universal/Documentation~/urp-renderer-feature.md b/com.unity.render-pipelines.universal/Documentation~/urp-renderer-feature.md index 3d44fc4373a..e43fd76cef4 100644 --- a/com.unity.render-pipelines.universal/Documentation~/urp-renderer-feature.md +++ b/com.unity.render-pipelines.universal/Documentation~/urp-renderer-feature.md @@ -21,6 +21,7 @@ See also: [How to use the Render Objects Renderer Feature](renderer-features/how | **Filters** | Settings that let you configure which objects this Renderer Feature renders. | | Queue | Select whether the feature renders opaque or transparent objects. | | Layer Mask | The Renderer Feature renders objects from layers you select in this property. | +| Camera Type Mask | Choose for which types of cameras the feature should run. | | **Pass Names** | If a Pass in a shader has the `LightMode` Pass Tag, this Renderer Feature processes only the shaders where the value of the `LightMode` Pass Tag equals one of the values in the Pass Names property. | | **Overrides** | Settings in this section let you configure overrides for certain properties when rendering with this Renderer Feature. | | Material | When rendering an object, Unity replaces the Material assigned to it with this Material. | diff --git a/com.unity.render-pipelines.universal/Editor/RendererFeatures/RenderObjectsPassFeatureEditor.cs b/com.unity.render-pipelines.universal/Editor/RendererFeatures/RenderObjectsPassFeatureEditor.cs index 5705901c28f..7bb48631fec 100644 --- a/com.unity.render-pipelines.universal/Editor/RendererFeatures/RenderObjectsPassFeatureEditor.cs +++ b/com.unity.render-pipelines.universal/Editor/RendererFeatures/RenderObjectsPassFeatureEditor.cs @@ -23,6 +23,7 @@ internal class Styles //Filters public static GUIContent renderQueueFilter = new GUIContent("Queue", "Only render objects in the selected render queue range."); public static GUIContent layerMask = new GUIContent("Layer Mask", "Only render objects in a layer that match the given layer mask."); + public static GUIContent cameraTypeMask = new GUIContent("Camera Type Mask", "Only render objects for cameras that match the given layer mask."); public static GUIContent shaderPassFilter = new GUIContent("LightMode Tags", "Controls which shader passes to render by filtering by LightMode tag."); //Render Options @@ -56,6 +57,7 @@ internal class Styles private SerializedProperty m_FilterSettings; private SerializedProperty m_RenderQueue; private SerializedProperty m_LayerMask; + private SerializedProperty m_CameraTypeMask; private SerializedProperty m_ShaderPasses; //Render props private SerializedProperty m_OverrideMaterial; @@ -105,6 +107,7 @@ private void Init(SerializedProperty property) m_FilterSettings = property.FindPropertyRelative("filterSettings"); m_RenderQueue = m_FilterSettings.FindPropertyRelative("RenderQueueType"); m_LayerMask = m_FilterSettings.FindPropertyRelative("LayerMask"); + m_CameraTypeMask = m_FilterSettings.FindPropertyRelative("CameraTypeMask"); m_ShaderPasses = m_FilterSettings.FindPropertyRelative("PassNames"); //Render options @@ -197,6 +200,9 @@ void DoFilters(ref Rect rect) //Layer mask EditorGUI.PropertyField(rect, m_LayerMask, Styles.layerMask); rect.y += Styles.defaultLineSpace; + // Camera type mask + EditorGUI.PropertyField(rect, m_CameraTypeMask, Styles.cameraTypeMask); + rect.y += Styles.defaultLineSpace; //Shader pass list EditorGUI.PropertyField(rect, m_ShaderPasses, Styles.shaderPassFilter, true); rect.y += EditorGUI.GetPropertyHeight(m_ShaderPasses); diff --git a/com.unity.render-pipelines.universal/Runtime/CameraTypeMask.cs b/com.unity.render-pipelines.universal/Runtime/CameraTypeMask.cs new file mode 100644 index 00000000000..82f0323b7fd --- /dev/null +++ b/com.unity.render-pipelines.universal/Runtime/CameraTypeMask.cs @@ -0,0 +1,56 @@ +using System; + +namespace UnityEngine.Experimental.Rendering.Universal +{ + /// + /// Specifies a set of camera types. + /// + [Flags] + [Serializable] + public enum CameraTypeMask + { + /// + /// Used to indicate a regular in-game camera. + /// + Game = 1 << 0, + /// + /// Used to indicate that a camera is used for rendering the Scene View in the Editor. + /// + SceneView = 1 << 1, + /// + /// Used to indicate a camera that is used for rendering previews in the Editor. + /// + Preview = 1 << 2, + /// + /// Used to indicate that a camera is used for rendering VR (in edit mode) in the Editor. + /// + VR = 1 << 3, + /// + /// Used to indicate a camera that is used for rendering reflection probes. + /// + Reflection = 1 << 4, + } + + static class CameraTypeMaskUtility + { + public static CameraTypeMask ToMask(this CameraType cameraType) + { + return cameraType switch + { + CameraType.Game => CameraTypeMask.Game, + CameraType.SceneView => CameraTypeMask.SceneView, + CameraType.Preview => CameraTypeMask.Preview, + CameraType.VR => CameraTypeMask.VR, + CameraType.Reflection => CameraTypeMask.Reflection, + _ => throw new ArgumentOutOfRangeException(nameof(cameraType), cameraType, "Unknown camera type") + }; + } + + public static bool Contains(this CameraTypeMask cameraTypeMask, CameraType cameraType) + { + return (cameraType.ToMask() & cameraTypeMask) != 0; + } + + public static CameraTypeMask allTypes => CameraTypeMask.Game | CameraTypeMask.SceneView | CameraTypeMask.Preview | CameraTypeMask.VR | CameraTypeMask.Reflection; + } +} diff --git a/com.unity.render-pipelines.universal/Runtime/CameraTypeMask.cs.meta b/com.unity.render-pipelines.universal/Runtime/CameraTypeMask.cs.meta new file mode 100644 index 00000000000..f5a9d9c19e9 --- /dev/null +++ b/com.unity.render-pipelines.universal/Runtime/CameraTypeMask.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a04f895465dde1842a6bfcbd3fd7ccc2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/com.unity.render-pipelines.universal/Runtime/Passes/RenderObjectsPass.cs b/com.unity.render-pipelines.universal/Runtime/Passes/RenderObjectsPass.cs index fe31806a579..97f488524e5 100644 --- a/com.unity.render-pipelines.universal/Runtime/Passes/RenderObjectsPass.cs +++ b/com.unity.render-pipelines.universal/Runtime/Passes/RenderObjectsPass.cs @@ -1,7 +1,6 @@ using System.Collections.Generic; using UnityEngine.Rendering.Universal; using UnityEngine.Rendering; -using UnityEngine.Scripting.APIUpdating; namespace UnityEngine.Experimental.Rendering.Universal { @@ -15,6 +14,7 @@ public class RenderObjectsPass : ScriptableRenderPass public Material overrideMaterial { get; set; } public int overrideMaterialPassIndex { get; set; } + public CameraTypeMask cameraTypeMask { get; set; } = CameraTypeMaskUtility.allTypes; List m_ShaderTagIdList = new List(); @@ -79,6 +79,11 @@ internal RenderObjectsPass(URPProfileId profileId, RenderPassEvent renderPassEve public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { + if (!cameraTypeMask.Contains(renderingData.cameraData.cameraType)) + { + return; + } + SortingCriteria sortingCriteria = (renderQueueType == RenderQueueType.Transparent) ? SortingCriteria.CommonTransparent : renderingData.cameraData.defaultOpaqueSortFlags; diff --git a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/RenderObjects.cs b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/RenderObjects.cs index 269d79e6b81..335391ea047 100644 --- a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/RenderObjects.cs +++ b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/RenderObjects.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System; using UnityEngine.Rendering.Universal; using UnityEngine.Rendering; @@ -40,11 +40,13 @@ public class FilterSettings // TODO: expose opaque, transparent, all ranges as drop down public RenderQueueType RenderQueueType; public LayerMask LayerMask; + public CameraTypeMask CameraTypeMask; public string[] PassNames; public FilterSettings() { RenderQueueType = RenderQueueType.Opaque; + CameraTypeMask = CameraTypeMaskUtility.allTypes; LayerMask = 0; } } @@ -77,6 +79,8 @@ public override void Create() renderObjectsPass = new RenderObjectsPass(settings.passTag, settings.Event, filter.PassNames, filter.RenderQueueType, filter.LayerMask, settings.cameraSettings); + renderObjectsPass.cameraTypeMask = filter.CameraTypeMask; + renderObjectsPass.overrideMaterial = settings.overrideMaterial; renderObjectsPass.overrideMaterialPassIndex = settings.overrideMaterialPassIndex; From 49483ae32612b2c319d39b4b883906e05f623cad Mon Sep 17 00:00:00 2001 From: Peter Bay Bastian Date: Thu, 7 Oct 2021 11:55:29 +0200 Subject: [PATCH 2/2] Moved setting up one level and updated change log --- com.unity.render-pipelines.universal/CHANGELOG.md | 1 + .../RenderObjectsPassFeatureEditor.cs | 13 +++++++------ .../Runtime/RendererFeatures/RenderObjects.cs | 5 ++--- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/com.unity.render-pipelines.universal/CHANGELOG.md b/com.unity.render-pipelines.universal/CHANGELOG.md index a78d674a4fc..6b4288e05eb 100644 --- a/com.unity.render-pipelines.universal/CHANGELOG.md +++ b/com.unity.render-pipelines.universal/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### Added - Added public api and updated docs for Light2D shape properties. - Depth Texture setting for Overlay Camera. +- Render Objects now has an option to only run on certain camera types using a camera type mask. ### Changed diff --git a/com.unity.render-pipelines.universal/Editor/RendererFeatures/RenderObjectsPassFeatureEditor.cs b/com.unity.render-pipelines.universal/Editor/RendererFeatures/RenderObjectsPassFeatureEditor.cs index 7bb48631fec..98fe8eea33a 100644 --- a/com.unity.render-pipelines.universal/Editor/RendererFeatures/RenderObjectsPassFeatureEditor.cs +++ b/com.unity.render-pipelines.universal/Editor/RendererFeatures/RenderObjectsPassFeatureEditor.cs @@ -15,6 +15,7 @@ internal class Styles { public static float defaultLineSpace = EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing; public static GUIContent callback = new GUIContent("Event", "Choose at which point this render pass is executed in the frame."); + public static GUIContent cameraTypeMask = new GUIContent("Camera Type Mask", "Only run the feature for cameras that match the given layer mask."); //Headers public static GUIContent filtersHeader = new GUIContent("Filters", "Settings that control which objects should be rendered."); @@ -23,7 +24,6 @@ internal class Styles //Filters public static GUIContent renderQueueFilter = new GUIContent("Queue", "Only render objects in the selected render queue range."); public static GUIContent layerMask = new GUIContent("Layer Mask", "Only render objects in a layer that match the given layer mask."); - public static GUIContent cameraTypeMask = new GUIContent("Camera Type Mask", "Only render objects for cameras that match the given layer mask."); public static GUIContent shaderPassFilter = new GUIContent("LightMode Tags", "Controls which shader passes to render by filtering by LightMode tag."); //Render Options @@ -52,12 +52,12 @@ internal class Styles // Serialized Properties private SerializedProperty m_Callback; + private SerializedProperty m_CameraTypeMask; private SerializedProperty m_PassTag; //Filter props private SerializedProperty m_FilterSettings; private SerializedProperty m_RenderQueue; private SerializedProperty m_LayerMask; - private SerializedProperty m_CameraTypeMask; private SerializedProperty m_ShaderPasses; //Render props private SerializedProperty m_OverrideMaterial; @@ -101,13 +101,13 @@ private void Init(SerializedProperty property) m_Callback = property.FindPropertyRelative("Event"); + m_CameraTypeMask = property.FindPropertyRelative("cameraTypeMask"); m_PassTag = property.FindPropertyRelative("passTag"); //Filter props m_FilterSettings = property.FindPropertyRelative("filterSettings"); m_RenderQueue = m_FilterSettings.FindPropertyRelative("RenderQueueType"); m_LayerMask = m_FilterSettings.FindPropertyRelative("LayerMask"); - m_CameraTypeMask = m_FilterSettings.FindPropertyRelative("CameraTypeMask"); m_ShaderPasses = m_FilterSettings.FindPropertyRelative("PassNames"); //Render options @@ -157,6 +157,10 @@ public override void OnGUI(Rect rect, SerializedProperty property, GUIContent la m_Callback.intValue = selectedValue; rect.y += Styles.defaultLineSpace; + // Camera type mask + EditorGUI.PropertyField(rect, m_CameraTypeMask, Styles.cameraTypeMask); + rect.y += Styles.defaultLineSpace; + DoFilters(ref rect); m_RenderFoldout.value = EditorGUI.Foldout(rect, m_RenderFoldout.value, Styles.renderHeader, true); @@ -200,9 +204,6 @@ void DoFilters(ref Rect rect) //Layer mask EditorGUI.PropertyField(rect, m_LayerMask, Styles.layerMask); rect.y += Styles.defaultLineSpace; - // Camera type mask - EditorGUI.PropertyField(rect, m_CameraTypeMask, Styles.cameraTypeMask); - rect.y += Styles.defaultLineSpace; //Shader pass list EditorGUI.PropertyField(rect, m_ShaderPasses, Styles.shaderPassFilter, true); rect.y += EditorGUI.GetPropertyHeight(m_ShaderPasses); diff --git a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/RenderObjects.cs b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/RenderObjects.cs index 335391ea047..a876e06ccb6 100644 --- a/com.unity.render-pipelines.universal/Runtime/RendererFeatures/RenderObjects.cs +++ b/com.unity.render-pipelines.universal/Runtime/RendererFeatures/RenderObjects.cs @@ -19,6 +19,7 @@ public class RenderObjectsSettings { public string passTag = "RenderObjectsFeature"; public RenderPassEvent Event = RenderPassEvent.AfterRenderingOpaques; + public CameraTypeMask cameraTypeMask = CameraTypeMaskUtility.allTypes; public FilterSettings filterSettings = new FilterSettings(); @@ -40,13 +41,11 @@ public class FilterSettings // TODO: expose opaque, transparent, all ranges as drop down public RenderQueueType RenderQueueType; public LayerMask LayerMask; - public CameraTypeMask CameraTypeMask; public string[] PassNames; public FilterSettings() { RenderQueueType = RenderQueueType.Opaque; - CameraTypeMask = CameraTypeMaskUtility.allTypes; LayerMask = 0; } } @@ -79,7 +78,7 @@ public override void Create() renderObjectsPass = new RenderObjectsPass(settings.passTag, settings.Event, filter.PassNames, filter.RenderQueueType, filter.LayerMask, settings.cameraSettings); - renderObjectsPass.cameraTypeMask = filter.CameraTypeMask; + renderObjectsPass.cameraTypeMask = settings.cameraTypeMask; renderObjectsPass.overrideMaterial = settings.overrideMaterial; renderObjectsPass.overrideMaterialPassIndex = settings.overrideMaterialPassIndex;