No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

UniversalRenderPipelineCameraUI.Rendering.Drawers.cs 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. using System.Linq;
  2. using UnityEngine;
  3. using UnityEngine.Rendering;
  4. using UnityEngine.Rendering.Universal;
  5. namespace UnityEditor.Rendering.Universal
  6. {
  7. using CED = CoreEditorDrawer<UniversalRenderPipelineSerializedCamera>;
  8. static partial class UniversalRenderPipelineCameraUI
  9. {
  10. public partial class Rendering
  11. {
  12. static bool s_PostProcessingWarningShown = false;
  13. private static readonly CED.IDrawer PostProcessingWarningDrawer = CED.Conditional(
  14. (serialized, owner) => IsAnyRendererHasPostProcessingEnabled(serialized, UniversalRenderPipeline.asset) && serialized.renderPostProcessing.boolValue,
  15. (serialized, owner) =>
  16. {
  17. EditorGUILayout.HelpBox(Styles.disabledPostprocessing, MessageType.Warning);
  18. s_PostProcessingWarningShown = true;
  19. });
  20. private static readonly CED.IDrawer PostProcessingAAWarningDrawer = CED.Conditional(
  21. (serialized, owner) => !s_PostProcessingWarningShown && IsAnyRendererHasPostProcessingEnabled(serialized, UniversalRenderPipeline.asset) && (AntialiasingMode)serialized.antialiasing.intValue != AntialiasingMode.None,
  22. (serialized, owner) =>
  23. {
  24. EditorGUILayout.HelpBox(Styles.disabledPostprocessing, MessageType.Warning);
  25. s_PostProcessingWarningShown = true;
  26. });
  27. private static readonly CED.IDrawer DisabledPostProcessingAAWarningDrawer = CED.Conditional(
  28. (serialized, owner) => !serialized.renderPostProcessing.boolValue && (AntialiasingMode)serialized.antialiasing.intValue != AntialiasingMode.None,
  29. (serialized, owner) => EditorGUILayout.HelpBox(Styles.disabledPostprocessingAntiAliasWarning, MessageType.Warning));
  30. private static readonly CED.IDrawer MSAAWarningDrawer = CED.Conditional(
  31. (serialized, owner) => (GraphicsSettings.currentRenderPipeline is UniversalRenderPipelineAsset asset && asset.msaaSampleCount > 1) && serialized.baseCameraSettings.allowMSAA.boolValue == true && (AntialiasingMode)serialized.antialiasing.intValue == AntialiasingMode.TemporalAntiAliasing,
  32. (serialized, owner) => EditorGUILayout.HelpBox(Styles.MSAAWarning, MessageType.Warning));
  33. private static readonly CED.IDrawer PostProcessingStopNaNsWarningDrawer = CED.Conditional(
  34. (serialized, owner) => !s_PostProcessingWarningShown && IsAnyRendererHasPostProcessingEnabled(serialized, UniversalRenderPipeline.asset) && serialized.stopNaNs.boolValue,
  35. (serialized, owner) =>
  36. {
  37. EditorGUILayout.HelpBox(Styles.disabledPostprocessing, MessageType.Warning);
  38. s_PostProcessingWarningShown = true;
  39. });
  40. private static readonly CED.IDrawer PostProcessingDitheringWarningDrawer = CED.Conditional(
  41. (serialized, owner) => !s_PostProcessingWarningShown && IsAnyRendererHasPostProcessingEnabled(serialized, UniversalRenderPipeline.asset) && serialized.dithering.boolValue,
  42. (serialized, owner) =>
  43. {
  44. EditorGUILayout.HelpBox(Styles.disabledPostprocessing, MessageType.Warning);
  45. s_PostProcessingWarningShown = true;
  46. });
  47. static readonly CED.IDrawer BaseCameraRenderTypeDrawer = CED.Conditional(
  48. (serialized, owner) => (CameraRenderType)serialized.cameraType.intValue == CameraRenderType.Base,
  49. CED.Group(
  50. DrawerRenderingRenderPostProcessing
  51. ),
  52. PostProcessingWarningDrawer,
  53. CED.Group(
  54. DrawerRenderingAntialiasing
  55. ),
  56. PostProcessingAAWarningDrawer,
  57. DisabledPostProcessingAAWarningDrawer,
  58. MSAAWarningDrawer,
  59. CED.Conditional(
  60. (serialized, owner) => !serialized.antialiasing.hasMultipleDifferentValues,
  61. CED.Group(
  62. GroupOption.Indent,
  63. new[]{
  64. CED.Conditional(
  65. (serialized, owner) => (AntialiasingMode)serialized.antialiasing.intValue ==
  66. AntialiasingMode.SubpixelMorphologicalAntiAliasing,
  67. CED.Group(
  68. DrawerRenderingSMAAQuality
  69. )),
  70. CED.Conditional(
  71. (serialized, owner) => (AntialiasingMode)serialized.antialiasing.intValue ==
  72. AntialiasingMode.TemporalAntiAliasing,
  73. CED.Group(
  74. DrawerRenderingTAAQuality
  75. ))
  76. }
  77. )
  78. ),
  79. CED.Group(
  80. CameraUI.Rendering.Drawer_Rendering_StopNaNs
  81. ),
  82. PostProcessingStopNaNsWarningDrawer,
  83. CED.Group(
  84. CameraUI.Rendering.Drawer_Rendering_Dithering
  85. ),
  86. PostProcessingDitheringWarningDrawer,
  87. CED.Group(
  88. DrawerRenderingRenderShadows,
  89. DrawerRenderingPriority,
  90. DrawerRenderingOpaqueTexture,
  91. DrawerRenderingDepthTexture
  92. )
  93. );
  94. static readonly CED.IDrawer OverlayCameraRenderTypeDrawer = CED.Conditional(
  95. (serialized, owner) => (CameraRenderType)serialized.cameraType.intValue == CameraRenderType.Overlay,
  96. CED.Group(
  97. DrawerRenderingRenderPostProcessing
  98. ),
  99. PostProcessingWarningDrawer,
  100. CED.Group(
  101. DrawerRenderingClearDepth,
  102. DrawerRenderingRenderShadows,
  103. DrawerRenderingDepthTexture
  104. )
  105. );
  106. public static readonly CED.IDrawer Drawer;
  107. public static readonly CED.IDrawer DrawerPreset;
  108. static Rendering()
  109. {
  110. Drawer = CED.AdditionalPropertiesFoldoutGroup(
  111. CameraUI.Rendering.Styles.header,
  112. Expandable.Rendering,
  113. k_ExpandedState,
  114. ExpandableAdditional.Rendering,
  115. k_ExpandedAdditionalState,
  116. CED.Group(
  117. CED.Group(
  118. DrawerRenderingRenderer
  119. ),
  120. BaseCameraRenderTypeDrawer,
  121. OverlayCameraRenderTypeDrawer,
  122. CED.Group(
  123. CameraUI.Rendering.Drawer_Rendering_CullingMask,
  124. CameraUI.Rendering.Drawer_Rendering_OcclusionCulling
  125. )
  126. ),
  127. CED.noop,
  128. FoldoutOption.Indent,
  129. (serialized, owner) => s_PostProcessingWarningShown = false
  130. );
  131. DrawerPreset = CED.FoldoutGroup(
  132. CameraUI.Rendering.Styles.header,
  133. Expandable.Rendering,
  134. k_ExpandedState,
  135. FoldoutOption.Indent,
  136. CED.Group(
  137. CameraUI.Rendering.Drawer_Rendering_CullingMask,
  138. CameraUI.Rendering.Drawer_Rendering_OcclusionCulling
  139. )
  140. );
  141. }
  142. static void DrawerRenderingRenderer(UniversalRenderPipelineSerializedCamera p, Editor owner)
  143. {
  144. var rpAsset = UniversalRenderPipeline.asset;
  145. int selectedRendererOption = p.renderer.intValue;
  146. EditorGUI.BeginChangeCheck();
  147. Rect controlRect = EditorGUILayout.GetControlRect(true);
  148. EditorGUI.BeginProperty(controlRect, Styles.rendererType, p.renderer);
  149. EditorGUI.showMixedValue = p.renderer.hasMultipleDifferentValues;
  150. int selectedRenderer = EditorGUI.IntPopup(controlRect, Styles.rendererType, selectedRendererOption, rpAsset.rendererDisplayList, rpAsset.rendererIndexList);
  151. EditorGUI.EndProperty();
  152. if (!rpAsset.ValidateRendererDataList())
  153. {
  154. EditorGUILayout.HelpBox(Styles.noRendererError, MessageType.Error);
  155. }
  156. else if (!rpAsset.ValidateRendererData(selectedRendererOption))
  157. {
  158. EditorGUILayout.HelpBox(Styles.missingRendererWarning, MessageType.Warning);
  159. var rect = EditorGUI.IndentedRect(EditorGUILayout.GetControlRect());
  160. if (GUI.Button(rect, Styles.selectRenderPipelineAsset))
  161. {
  162. Selection.activeObject = AssetDatabase.LoadAssetAtPath<UniversalRenderPipelineAsset>(AssetDatabase.GetAssetPath(UniversalRenderPipeline.asset));
  163. }
  164. GUILayout.Space(5);
  165. }
  166. if (EditorGUI.EndChangeCheck())
  167. p.renderer.intValue = selectedRenderer;
  168. }
  169. static bool IsAnyRendererHasPostProcessingEnabled(UniversalRenderPipelineSerializedCamera p, UniversalRenderPipelineAsset rpAsset)
  170. {
  171. int selectedRendererOption = p.renderer.intValue;
  172. if (selectedRendererOption < -1 || selectedRendererOption >= rpAsset.m_RendererDataList.Length || p.renderer.hasMultipleDifferentValues)
  173. return false;
  174. var rendererData = selectedRendererOption == -1 ? rpAsset.scriptableRendererData : rpAsset.m_RendererDataList[selectedRendererOption];
  175. var forwardRendererData = rendererData as UniversalRendererData;
  176. if (forwardRendererData != null && forwardRendererData.postProcessData == null)
  177. return true;
  178. var renderer2DData = rendererData as UnityEngine.Rendering.Universal.Renderer2DData;
  179. return renderer2DData != null && renderer2DData.postProcessData == null;
  180. }
  181. static void DrawerRenderingAntialiasing(UniversalRenderPipelineSerializedCamera p, Editor owner)
  182. {
  183. Rect antiAliasingRect = EditorGUILayout.GetControlRect();
  184. EditorGUI.BeginProperty(antiAliasingRect, Styles.antialiasing, p.antialiasing);
  185. {
  186. EditorGUI.BeginChangeCheck();
  187. int selectedValue = (int)(AntialiasingMode)EditorGUI.EnumPopup(antiAliasingRect, Styles.antialiasing, (AntialiasingMode)p.antialiasing.intValue);
  188. if (EditorGUI.EndChangeCheck())
  189. p.antialiasing.intValue = selectedValue;
  190. }
  191. EditorGUI.EndProperty();
  192. }
  193. static void DrawerRenderingClearDepth(UniversalRenderPipelineSerializedCamera p, Editor owner)
  194. {
  195. EditorGUILayout.PropertyField(p.clearDepth, Styles.clearDepth);
  196. }
  197. static void DrawerRenderingRenderShadows(UniversalRenderPipelineSerializedCamera p, Editor owner)
  198. {
  199. EditorGUILayout.PropertyField(p.renderShadows, Styles.renderingShadows);
  200. }
  201. static void DrawerRenderingSMAAQuality(UniversalRenderPipelineSerializedCamera p, Editor owner)
  202. {
  203. EditorGUILayout.PropertyField(p.antialiasingQuality, Styles.antialiasingQuality);
  204. }
  205. static void DrawerRenderingTAAQuality(UniversalRenderPipelineSerializedCamera p, Editor owner)
  206. {
  207. EditorGUILayout.PropertyField(p.taaQuality, Styles.antialiasingQuality);
  208. {
  209. // FSR overrides TAA CAS settings. Disable this setting when FSR is enabled.
  210. bool disableSharpnessControl = UniversalRenderPipeline.asset != null ?
  211. (UniversalRenderPipeline.asset.upscalingFilter == UpscalingFilterSelection.FSR) : false;
  212. using var disable = new EditorGUI.DisabledScope(disableSharpnessControl);
  213. EditorGUILayout.Slider(p.taaContrastAdaptiveSharpening, 0.0f, 1.0f, Styles.taaContrastAdaptiveSharpening);
  214. }
  215. bool additionalPropertiesVisible = k_ExpandedState[Expandable.Rendering] && k_ExpandedAdditionalState[ExpandableAdditional.Rendering];
  216. if (additionalPropertiesVisible)
  217. {
  218. p.taaFrameInfluence.floatValue = 1.0f - EditorGUILayout.Slider(Styles.taaBaseBlendFactor, 1.0f - p.taaFrameInfluence.floatValue, 0.6f, 0.98f);
  219. EditorGUILayout.Slider(p.taaJitterScale, 0.0f, 1.0f, Styles.taaJitterScale);
  220. EditorGUILayout.Slider(p.taaMipBias, -1.0f, 0.0f, Styles.taaMipBias);
  221. if(p.taaQuality.intValue >= (int)TemporalAAQuality.Medium)
  222. EditorGUILayout.Slider(p.taaVarianceClampScale, 0.6f, 1.2f, Styles.taaVarianceClampScale);
  223. bool isEditorInDeveloperMode = EditorPrefs.GetBool("DeveloperMode");
  224. if (isEditorInDeveloperMode)
  225. {
  226. UniversalRenderPipelineCameraEditor urpCamEditor = owner as UniversalRenderPipelineCameraEditor;
  227. if (urpCamEditor != null && urpCamEditor.camera != null &&
  228. urpCamEditor.camera.TryGetComponent<UniversalAdditionalCameraData>(out var urpAddCamData))
  229. {
  230. ref var taa = ref urpAddCamData.taaSettings;
  231. var rect = GUILayoutUtility.GetRect(Styles.taaResetHistory, GUIStyle.none);
  232. rect.x = rect.x + 32;
  233. rect.width = rect.width - 32;
  234. rect.height += 4; // avoid clipping the label.
  235. if (GUI.Button(rect, Styles.taaResetHistory))
  236. taa.resetHistoryFrames += 2; // XR both eyes
  237. }
  238. }
  239. }
  240. }
  241. static void DrawerRenderingRenderPostProcessing(UniversalRenderPipelineSerializedCamera p, Editor owner)
  242. {
  243. EditorGUILayout.PropertyField(p.renderPostProcessing, Styles.renderPostProcessing);
  244. }
  245. static void DrawerRenderingPriority(UniversalRenderPipelineSerializedCamera p, Editor owner)
  246. {
  247. EditorGUILayout.PropertyField(p.baseCameraSettings.depth, Styles.priority);
  248. }
  249. static void DrawerRenderingDepthTexture(UniversalRenderPipelineSerializedCamera p, Editor owner)
  250. {
  251. EditorGUILayout.PropertyField(p.renderDepth, Styles.requireDepthTexture);
  252. }
  253. static void DrawerRenderingOpaqueTexture(UniversalRenderPipelineSerializedCamera p, Editor owner)
  254. {
  255. EditorGUILayout.PropertyField(p.renderOpaque, Styles.requireOpaqueTexture);
  256. }
  257. }
  258. }
  259. }