From a10eea6e4ce647061813519d5b0ea496f29495b9 Mon Sep 17 00:00:00 2001
From: leonard Wu <364452445@qq.com>
Date: 星期四, 09 八月 2018 09:47:08 +0800
Subject: [PATCH] 同步最新svn内容
---
Assets/Plugins/PostProcessing/Runtime/PostProcessingBehaviour.cs | 950 +++++++++++++++++++++++++++++-----------------------------
1 files changed, 475 insertions(+), 475 deletions(-)
diff --git a/Assets/Plugins/PostProcessing/Runtime/PostProcessingBehaviour.cs b/Assets/Plugins/PostProcessing/Runtime/PostProcessingBehaviour.cs
index 166f31e..0b5c2d3 100644
--- a/Assets/Plugins/PostProcessing/Runtime/PostProcessingBehaviour.cs
+++ b/Assets/Plugins/PostProcessing/Runtime/PostProcessingBehaviour.cs
@@ -1,475 +1,475 @@
-using System;
-using System.Collections.Generic;
-using UnityEngine.Rendering;
-
-namespace UnityEngine.PostProcessing
-{
- using DebugMode = BuiltinDebugViewsModel.Mode;
-
-#if UNITY_5_4_OR_NEWER
- [ImageEffectAllowedInSceneView]
-#endif
- [RequireComponent(typeof(Camera)), DisallowMultipleComponent, ExecuteInEditMode]
- [AddComponentMenu("Effects/Post-Processing Behaviour", -1)]
- public class PostProcessingBehaviour : MonoBehaviour
- {
- // Inspector fields
- public PostProcessingProfile profile;
-
- public Func<Vector2, Matrix4x4> jitteredMatrixFunc;
-
- // Internal helpers
- Dictionary<Type, KeyValuePair<CameraEvent, CommandBuffer>> m_CommandBuffers;
- List<PostProcessingComponentBase> m_Components;
- Dictionary<PostProcessingComponentBase, bool> m_ComponentStates;
-
- MaterialFactory m_MaterialFactory;
- RenderTextureFactory m_RenderTextureFactory;
- PostProcessingContext m_Context;
- Camera m_Camera;
- PostProcessingProfile m_PreviousProfile;
-
- bool m_RenderingInSceneView = false;
-
- // Effect components
- BuiltinDebugViewsComponent m_DebugViews;
- AmbientOcclusionComponent m_AmbientOcclusion;
- ScreenSpaceReflectionComponent m_ScreenSpaceReflection;
- FogComponent m_FogComponent;
- MotionBlurComponent m_MotionBlur;
- TaaComponent m_Taa;
- EyeAdaptationComponent m_EyeAdaptation;
- DepthOfFieldComponent m_DepthOfField;
- BloomComponent m_Bloom;
- ChromaticAberrationComponent m_ChromaticAberration;
- ColorGradingComponent m_ColorGrading;
- UserLutComponent m_UserLut;
- GrainComponent m_Grain;
- VignetteComponent m_Vignette;
- DitheringComponent m_Dithering;
- FxaaComponent m_Fxaa;
-
- void OnEnable()
- {
- m_CommandBuffers = new Dictionary<Type, KeyValuePair<CameraEvent, CommandBuffer>>();
- m_MaterialFactory = new MaterialFactory();
- m_RenderTextureFactory = new RenderTextureFactory();
- m_Context = new PostProcessingContext();
-
- // Keep a list of all post-fx for automation purposes
- m_Components = new List<PostProcessingComponentBase>();
-
- // Component list
- m_DebugViews = AddComponent(new BuiltinDebugViewsComponent());
- m_AmbientOcclusion = AddComponent(new AmbientOcclusionComponent());
- m_ScreenSpaceReflection = AddComponent(new ScreenSpaceReflectionComponent());
- m_FogComponent = AddComponent(new FogComponent());
- m_MotionBlur = AddComponent(new MotionBlurComponent());
- m_Taa = AddComponent(new TaaComponent());
- m_EyeAdaptation = AddComponent(new EyeAdaptationComponent());
- m_DepthOfField = AddComponent(new DepthOfFieldComponent());
- m_Bloom = AddComponent(new BloomComponent());
- m_ChromaticAberration = AddComponent(new ChromaticAberrationComponent());
- m_ColorGrading = AddComponent(new ColorGradingComponent());
- m_UserLut = AddComponent(new UserLutComponent());
- m_Grain = AddComponent(new GrainComponent());
- m_Vignette = AddComponent(new VignetteComponent());
- m_Dithering = AddComponent(new DitheringComponent());
- m_Fxaa = AddComponent(new FxaaComponent());
-
- // Prepare state observers
- m_ComponentStates = new Dictionary<PostProcessingComponentBase, bool>();
-
- foreach (var component in m_Components)
- m_ComponentStates.Add(component, false);
-
- useGUILayout = false;
- }
-
- void OnPreCull()
- {
- // All the per-frame initialization logic has to be done in OnPreCull instead of Update
- // because [ImageEffectAllowedInSceneView] doesn't trigger Update events...
-
- m_Camera = GetComponent<Camera>();
-
- if (profile == null || m_Camera == null)
- return;
-
-#if UNITY_EDITOR
- // Track the scene view camera to disable some effects we don't want to see in the
- // scene view
- // Currently disabled effects :
- // - Temporal Antialiasing
- // - Depth of Field
- // - Motion blur
- m_RenderingInSceneView = UnityEditor.SceneView.currentDrawingSceneView != null
- && UnityEditor.SceneView.currentDrawingSceneView.camera == m_Camera;
-#endif
-
- // Prepare context
- var context = m_Context.Reset();
- context.profile = profile;
- context.renderTextureFactory = m_RenderTextureFactory;
- context.materialFactory = m_MaterialFactory;
- context.camera = m_Camera;
-
- // Prepare components
- m_DebugViews.Init(context, profile.debugViews);
- m_AmbientOcclusion.Init(context, profile.ambientOcclusion);
- m_ScreenSpaceReflection.Init(context, profile.screenSpaceReflection);
- m_FogComponent.Init(context, profile.fog);
- m_MotionBlur.Init(context, profile.motionBlur);
- m_Taa.Init(context, profile.antialiasing);
- m_EyeAdaptation.Init(context, profile.eyeAdaptation);
- m_DepthOfField.Init(context, profile.depthOfField);
- m_Bloom.Init(context, profile.bloom);
- m_ChromaticAberration.Init(context, profile.chromaticAberration);
- m_ColorGrading.Init(context, profile.colorGrading);
- m_UserLut.Init(context, profile.userLut);
- m_Grain.Init(context, profile.grain);
- m_Vignette.Init(context, profile.vignette);
- m_Dithering.Init(context, profile.dithering);
- m_Fxaa.Init(context, profile.antialiasing);
-
- // Handles profile change and 'enable' state observers
- if (m_PreviousProfile != profile)
- {
- DisableComponents();
- m_PreviousProfile = profile;
- }
-
- CheckObservers();
-
- // Find out which camera flags are needed before rendering begins
- // Note that motion vectors will only be available one frame after being enabled
- var flags = context.camera.depthTextureMode;
- foreach (var component in m_Components)
- {
- if (component.active)
- flags |= component.GetCameraFlags();
- }
-
- context.camera.depthTextureMode = flags;
-
- // Temporal antialiasing jittering, needs to happen before culling
- if (!m_RenderingInSceneView && m_Taa.active && !profile.debugViews.willInterrupt)
- m_Taa.SetProjectionMatrix(jitteredMatrixFunc);
- }
-
- void OnPreRender()
- {
- if (profile == null)
- return;
-
- // Command buffer-based effects should be set-up here
- TryExecuteCommandBuffer(m_DebugViews);
- TryExecuteCommandBuffer(m_AmbientOcclusion);
- TryExecuteCommandBuffer(m_ScreenSpaceReflection);
- TryExecuteCommandBuffer(m_FogComponent);
-
- if (!m_RenderingInSceneView)
- TryExecuteCommandBuffer(m_MotionBlur);
- }
-
- void OnPostRender()
- {
- if (profile == null || m_Camera == null)
- return;
-
- if (!m_RenderingInSceneView && m_Taa.active && !profile.debugViews.willInterrupt)
- m_Context.camera.ResetProjectionMatrix();
- }
-
- // Classic render target pipeline for RT-based effects
- void OnRenderImage(RenderTexture source, RenderTexture destination)
- {
- if (profile == null || m_Camera == null)
- {
- Graphics.Blit(source, destination);
- return;
- }
-
- // Uber shader setup
- bool uberActive = false;
- bool fxaaActive = m_Fxaa.active;
- bool taaActive = m_Taa.active && !m_RenderingInSceneView;
- bool dofActive = m_DepthOfField.active && !m_RenderingInSceneView;
-
- var uberMaterial = m_MaterialFactory.Get("Hidden/Post FX/Uber Shader");
- uberMaterial.shaderKeywords = null;
-
- var src = source;
- var dst = destination;
-
- if (taaActive)
- {
- var tempRT = m_RenderTextureFactory.Get(src);
- m_Taa.Render(src, tempRT);
- src = tempRT;
- }
-
-#if UNITY_EDITOR
- // Render to a dedicated target when monitors are enabled so they can show information
- // about the final render.
- // At runtime the output will always be the backbuffer or whatever render target is
- // currently set on the camera.
- if (profile.monitors.onFrameEndEditorOnly != null)
- dst = m_RenderTextureFactory.Get(src);
-#endif
-
- Texture autoExposure = GraphicsUtils.whiteTexture;
- if (m_EyeAdaptation.active)
- {
- uberActive = true;
- autoExposure = m_EyeAdaptation.Prepare(src, uberMaterial);
- }
-
- uberMaterial.SetTexture("_AutoExposure", autoExposure);
-
- if (dofActive)
- {
- uberActive = true;
- m_DepthOfField.Prepare(src, uberMaterial, taaActive, m_Taa.jitterVector, m_Taa.model.settings.taaSettings.motionBlending);
- }
-
- if (m_Bloom.active)
- {
- uberActive = true;
- m_Bloom.Prepare(src, uberMaterial, autoExposure);
- }
-
- uberActive |= TryPrepareUberImageEffect(m_ChromaticAberration, uberMaterial);
- uberActive |= TryPrepareUberImageEffect(m_ColorGrading, uberMaterial);
- uberActive |= TryPrepareUberImageEffect(m_Vignette, uberMaterial);
- uberActive |= TryPrepareUberImageEffect(m_UserLut, uberMaterial);
-
- var fxaaMaterial = fxaaActive
- ? m_MaterialFactory.Get("Hidden/Post FX/FXAA")
- : null;
-
- if (fxaaActive)
- {
- fxaaMaterial.shaderKeywords = null;
- TryPrepareUberImageEffect(m_Grain, fxaaMaterial);
- TryPrepareUberImageEffect(m_Dithering, fxaaMaterial);
-
- if (uberActive)
- {
- var output = m_RenderTextureFactory.Get(src);
- Graphics.Blit(src, output, uberMaterial, 0);
- src = output;
- }
-
- m_Fxaa.Render(src, dst);
- }
- else
- {
- uberActive |= TryPrepareUberImageEffect(m_Grain, uberMaterial);
- uberActive |= TryPrepareUberImageEffect(m_Dithering, uberMaterial);
-
- if (uberActive)
- {
- if (!GraphicsUtils.isLinearColorSpace)
- uberMaterial.EnableKeyword("UNITY_COLORSPACE_GAMMA");
-
- Graphics.Blit(src, dst, uberMaterial, 0);
- }
- }
-
- if (!uberActive && !fxaaActive)
- Graphics.Blit(src, dst);
-
-#if UNITY_EDITOR
- if (profile.monitors.onFrameEndEditorOnly != null)
- {
- Graphics.Blit(dst, destination);
-
- var oldRt = RenderTexture.active;
- profile.monitors.onFrameEndEditorOnly(dst);
- RenderTexture.active = oldRt;
- }
-#endif
-
- m_RenderTextureFactory.ReleaseAll();
- }
-
- void OnGUI()
- {
- if (!this.enabled)
- {
- return;
- }
-
- if (Event.current.type != EventType.Repaint)
- return;
-
- if (profile == null || m_Camera == null)
- return;
-
- if (m_EyeAdaptation.active && profile.debugViews.IsModeActive(DebugMode.EyeAdaptation))
- m_EyeAdaptation.OnGUI();
- else if (m_ColorGrading.active && profile.debugViews.IsModeActive(DebugMode.LogLut))
- m_ColorGrading.OnGUI();
- else if (m_UserLut.active && profile.debugViews.IsModeActive(DebugMode.UserLut))
- m_UserLut.OnGUI();
- }
-
- void OnDisable()
- {
- // Clear command buffers
- foreach (var cb in m_CommandBuffers.Values)
- {
- m_Camera.RemoveCommandBuffer(cb.Key, cb.Value);
- cb.Value.Dispose();
- }
-
- m_CommandBuffers.Clear();
-
- // Clear components
- if (profile != null)
- DisableComponents();
-
- m_Components.Clear();
-
- // Factories
- m_MaterialFactory.Dispose();
- m_RenderTextureFactory.Dispose();
- GraphicsUtils.Dispose();
- }
-
- public void ResetTemporalEffects()
- {
- m_Taa.ResetHistory();
- m_MotionBlur.ResetHistory();
- m_EyeAdaptation.ResetHistory();
- }
-
- #region State management
-
- List<PostProcessingComponentBase> m_ComponentsToEnable = new List<PostProcessingComponentBase>();
- List<PostProcessingComponentBase> m_ComponentsToDisable = new List<PostProcessingComponentBase>();
-
- void CheckObservers()
- {
- foreach (var cs in m_ComponentStates)
- {
- var component = cs.Key;
- var state = component.GetModel().enabled;
-
- if (state != cs.Value)
- {
- if (state) m_ComponentsToEnable.Add(component);
- else m_ComponentsToDisable.Add(component);
- }
- }
-
- for (int i = 0; i < m_ComponentsToDisable.Count; i++)
- {
- var c = m_ComponentsToDisable[i];
- m_ComponentStates[c] = false;
- c.OnDisable();
- }
-
- for (int i = 0; i < m_ComponentsToEnable.Count; i++)
- {
- var c = m_ComponentsToEnable[i];
- m_ComponentStates[c] = true;
- c.OnEnable();
- }
-
- m_ComponentsToDisable.Clear();
- m_ComponentsToEnable.Clear();
- }
-
- void DisableComponents()
- {
- foreach (var component in m_Components)
- {
- var model = component.GetModel();
- if (model != null && model.enabled)
- component.OnDisable();
- }
- }
-
- #endregion
-
- #region Command buffer handling & rendering helpers
- // Placeholders before the upcoming Scriptable Render Loop as command buffers will be
- // executed on the go so we won't need of all that stuff
- CommandBuffer AddCommandBuffer<T>(CameraEvent evt, string name)
- where T : PostProcessingModel
- {
- var cb = new CommandBuffer { name = name };
- var kvp = new KeyValuePair<CameraEvent, CommandBuffer>(evt, cb);
- m_CommandBuffers.Add(typeof(T), kvp);
- m_Camera.AddCommandBuffer(evt, kvp.Value);
- return kvp.Value;
- }
-
- void RemoveCommandBuffer<T>()
- where T : PostProcessingModel
- {
- KeyValuePair<CameraEvent, CommandBuffer> kvp;
- var type = typeof(T);
-
- if (!m_CommandBuffers.TryGetValue(type, out kvp))
- return;
-
- m_Camera.RemoveCommandBuffer(kvp.Key, kvp.Value);
- m_CommandBuffers.Remove(type);
- kvp.Value.Dispose();
- }
-
- CommandBuffer GetCommandBuffer<T>(CameraEvent evt, string name)
- where T : PostProcessingModel
- {
- CommandBuffer cb;
- KeyValuePair<CameraEvent, CommandBuffer> kvp;
-
- if (!m_CommandBuffers.TryGetValue(typeof(T), out kvp))
- {
- cb = AddCommandBuffer<T>(evt, name);
- }
- else if (kvp.Key != evt)
- {
- RemoveCommandBuffer<T>();
- cb = AddCommandBuffer<T>(evt, name);
- }
- else cb = kvp.Value;
-
- return cb;
- }
-
- void TryExecuteCommandBuffer<T>(PostProcessingComponentCommandBuffer<T> component)
- where T : PostProcessingModel
- {
- if (component.active)
- {
- var cb = GetCommandBuffer<T>(component.GetCameraEvent(), component.GetName());
- cb.Clear();
- component.PopulateCommandBuffer(cb);
- }
- else RemoveCommandBuffer<T>();
- }
-
- bool TryPrepareUberImageEffect<T>(PostProcessingComponentRenderTexture<T> component, Material material)
- where T : PostProcessingModel
- {
- if (!component.active)
- return false;
-
- component.Prepare(material);
- return true;
- }
-
- T AddComponent<T>(T component)
- where T : PostProcessingComponentBase
- {
- m_Components.Add(component);
- return component;
- }
-
- #endregion
- }
-}
+using System;
+using System.Collections.Generic;
+using UnityEngine.Rendering;
+
+namespace UnityEngine.PostProcessing
+{
+ using DebugMode = BuiltinDebugViewsModel.Mode;
+
+#if UNITY_5_4_OR_NEWER
+ [ImageEffectAllowedInSceneView]
+#endif
+ [RequireComponent(typeof(Camera)), DisallowMultipleComponent, ExecuteInEditMode]
+ [AddComponentMenu("Effects/Post-Processing Behaviour", -1)]
+ public class PostProcessingBehaviour : MonoBehaviour
+ {
+ // Inspector fields
+ public PostProcessingProfile profile;
+
+ public Func<Vector2, Matrix4x4> jitteredMatrixFunc;
+
+ // Internal helpers
+ Dictionary<Type, KeyValuePair<CameraEvent, CommandBuffer>> m_CommandBuffers;
+ List<PostProcessingComponentBase> m_Components;
+ Dictionary<PostProcessingComponentBase, bool> m_ComponentStates;
+
+ MaterialFactory m_MaterialFactory;
+ RenderTextureFactory m_RenderTextureFactory;
+ PostProcessingContext m_Context;
+ Camera m_Camera;
+ PostProcessingProfile m_PreviousProfile;
+
+ bool m_RenderingInSceneView = false;
+
+ // Effect components
+ BuiltinDebugViewsComponent m_DebugViews;
+ AmbientOcclusionComponent m_AmbientOcclusion;
+ ScreenSpaceReflectionComponent m_ScreenSpaceReflection;
+ FogComponent m_FogComponent;
+ MotionBlurComponent m_MotionBlur;
+ TaaComponent m_Taa;
+ EyeAdaptationComponent m_EyeAdaptation;
+ DepthOfFieldComponent m_DepthOfField;
+ BloomComponent m_Bloom;
+ ChromaticAberrationComponent m_ChromaticAberration;
+ ColorGradingComponent m_ColorGrading;
+ UserLutComponent m_UserLut;
+ GrainComponent m_Grain;
+ VignetteComponent m_Vignette;
+ DitheringComponent m_Dithering;
+ FxaaComponent m_Fxaa;
+
+ void OnEnable()
+ {
+ m_CommandBuffers = new Dictionary<Type, KeyValuePair<CameraEvent, CommandBuffer>>();
+ m_MaterialFactory = new MaterialFactory();
+ m_RenderTextureFactory = new RenderTextureFactory();
+ m_Context = new PostProcessingContext();
+
+ // Keep a list of all post-fx for automation purposes
+ m_Components = new List<PostProcessingComponentBase>();
+
+ // Component list
+ m_DebugViews = AddComponent(new BuiltinDebugViewsComponent());
+ m_AmbientOcclusion = AddComponent(new AmbientOcclusionComponent());
+ m_ScreenSpaceReflection = AddComponent(new ScreenSpaceReflectionComponent());
+ m_FogComponent = AddComponent(new FogComponent());
+ m_MotionBlur = AddComponent(new MotionBlurComponent());
+ m_Taa = AddComponent(new TaaComponent());
+ m_EyeAdaptation = AddComponent(new EyeAdaptationComponent());
+ m_DepthOfField = AddComponent(new DepthOfFieldComponent());
+ m_Bloom = AddComponent(new BloomComponent());
+ m_ChromaticAberration = AddComponent(new ChromaticAberrationComponent());
+ m_ColorGrading = AddComponent(new ColorGradingComponent());
+ m_UserLut = AddComponent(new UserLutComponent());
+ m_Grain = AddComponent(new GrainComponent());
+ m_Vignette = AddComponent(new VignetteComponent());
+ m_Dithering = AddComponent(new DitheringComponent());
+ m_Fxaa = AddComponent(new FxaaComponent());
+
+ // Prepare state observers
+ m_ComponentStates = new Dictionary<PostProcessingComponentBase, bool>();
+
+ foreach (var component in m_Components)
+ m_ComponentStates.Add(component, false);
+
+ useGUILayout = false;
+ }
+
+ void OnPreCull()
+ {
+ // All the per-frame initialization logic has to be done in OnPreCull instead of Update
+ // because [ImageEffectAllowedInSceneView] doesn't trigger Update events...
+
+ m_Camera = GetComponent<Camera>();
+
+ if (profile == null || m_Camera == null)
+ return;
+
+#if UNITY_EDITOR
+ // Track the scene view camera to disable some effects we don't want to see in the
+ // scene view
+ // Currently disabled effects :
+ // - Temporal Antialiasing
+ // - Depth of Field
+ // - Motion blur
+ m_RenderingInSceneView = UnityEditor.SceneView.currentDrawingSceneView != null
+ && UnityEditor.SceneView.currentDrawingSceneView.camera == m_Camera;
+#endif
+
+ // Prepare context
+ var context = m_Context.Reset();
+ context.profile = profile;
+ context.renderTextureFactory = m_RenderTextureFactory;
+ context.materialFactory = m_MaterialFactory;
+ context.camera = m_Camera;
+
+ // Prepare components
+ m_DebugViews.Init(context, profile.debugViews);
+ m_AmbientOcclusion.Init(context, profile.ambientOcclusion);
+ m_ScreenSpaceReflection.Init(context, profile.screenSpaceReflection);
+ m_FogComponent.Init(context, profile.fog);
+ m_MotionBlur.Init(context, profile.motionBlur);
+ m_Taa.Init(context, profile.antialiasing);
+ m_EyeAdaptation.Init(context, profile.eyeAdaptation);
+ m_DepthOfField.Init(context, profile.depthOfField);
+ m_Bloom.Init(context, profile.bloom);
+ m_ChromaticAberration.Init(context, profile.chromaticAberration);
+ m_ColorGrading.Init(context, profile.colorGrading);
+ m_UserLut.Init(context, profile.userLut);
+ m_Grain.Init(context, profile.grain);
+ m_Vignette.Init(context, profile.vignette);
+ m_Dithering.Init(context, profile.dithering);
+ m_Fxaa.Init(context, profile.antialiasing);
+
+ // Handles profile change and 'enable' state observers
+ if (m_PreviousProfile != profile)
+ {
+ DisableComponents();
+ m_PreviousProfile = profile;
+ }
+
+ CheckObservers();
+
+ // Find out which camera flags are needed before rendering begins
+ // Note that motion vectors will only be available one frame after being enabled
+ var flags = context.camera.depthTextureMode;
+ foreach (var component in m_Components)
+ {
+ if (component.active)
+ flags |= component.GetCameraFlags();
+ }
+
+ context.camera.depthTextureMode = flags;
+
+ // Temporal antialiasing jittering, needs to happen before culling
+ if (!m_RenderingInSceneView && m_Taa.active && !profile.debugViews.willInterrupt)
+ m_Taa.SetProjectionMatrix(jitteredMatrixFunc);
+ }
+
+ void OnPreRender()
+ {
+ if (profile == null)
+ return;
+
+ // Command buffer-based effects should be set-up here
+ TryExecuteCommandBuffer(m_DebugViews);
+ TryExecuteCommandBuffer(m_AmbientOcclusion);
+ TryExecuteCommandBuffer(m_ScreenSpaceReflection);
+ TryExecuteCommandBuffer(m_FogComponent);
+
+ if (!m_RenderingInSceneView)
+ TryExecuteCommandBuffer(m_MotionBlur);
+ }
+
+ void OnPostRender()
+ {
+ if (profile == null || m_Camera == null)
+ return;
+
+ if (!m_RenderingInSceneView && m_Taa.active && !profile.debugViews.willInterrupt)
+ m_Context.camera.ResetProjectionMatrix();
+ }
+
+ // Classic render target pipeline for RT-based effects
+ void OnRenderImage(RenderTexture source, RenderTexture destination)
+ {
+ if (profile == null || m_Camera == null)
+ {
+ Graphics.Blit(source, destination);
+ return;
+ }
+
+ // Uber shader setup
+ bool uberActive = false;
+ bool fxaaActive = m_Fxaa.active;
+ bool taaActive = m_Taa.active && !m_RenderingInSceneView;
+ bool dofActive = m_DepthOfField.active && !m_RenderingInSceneView;
+
+ var uberMaterial = m_MaterialFactory.Get("Hidden/Post FX/Uber Shader");
+ uberMaterial.shaderKeywords = null;
+
+ var src = source;
+ var dst = destination;
+
+ if (taaActive)
+ {
+ var tempRT = m_RenderTextureFactory.Get(src);
+ m_Taa.Render(src, tempRT);
+ src = tempRT;
+ }
+
+#if UNITY_EDITOR
+ // Render to a dedicated target when monitors are enabled so they can show information
+ // about the final render.
+ // At runtime the output will always be the backbuffer or whatever render target is
+ // currently set on the camera.
+ if (profile.monitors.onFrameEndEditorOnly != null)
+ dst = m_RenderTextureFactory.Get(src);
+#endif
+
+ Texture autoExposure = GraphicsUtils.whiteTexture;
+ if (m_EyeAdaptation.active)
+ {
+ uberActive = true;
+ autoExposure = m_EyeAdaptation.Prepare(src, uberMaterial);
+ }
+
+ uberMaterial.SetTexture("_AutoExposure", autoExposure);
+
+ if (dofActive)
+ {
+ uberActive = true;
+ m_DepthOfField.Prepare(src, uberMaterial, taaActive, m_Taa.jitterVector, m_Taa.model.settings.taaSettings.motionBlending);
+ }
+
+ if (m_Bloom.active)
+ {
+ uberActive = true;
+ m_Bloom.Prepare(src, uberMaterial, autoExposure);
+ }
+
+ uberActive |= TryPrepareUberImageEffect(m_ChromaticAberration, uberMaterial);
+ uberActive |= TryPrepareUberImageEffect(m_ColorGrading, uberMaterial);
+ uberActive |= TryPrepareUberImageEffect(m_Vignette, uberMaterial);
+ uberActive |= TryPrepareUberImageEffect(m_UserLut, uberMaterial);
+
+ var fxaaMaterial = fxaaActive
+ ? m_MaterialFactory.Get("Hidden/Post FX/FXAA")
+ : null;
+
+ if (fxaaActive)
+ {
+ fxaaMaterial.shaderKeywords = null;
+ TryPrepareUberImageEffect(m_Grain, fxaaMaterial);
+ TryPrepareUberImageEffect(m_Dithering, fxaaMaterial);
+
+ if (uberActive)
+ {
+ var output = m_RenderTextureFactory.Get(src);
+ Graphics.Blit(src, output, uberMaterial, 0);
+ src = output;
+ }
+
+ m_Fxaa.Render(src, dst);
+ }
+ else
+ {
+ uberActive |= TryPrepareUberImageEffect(m_Grain, uberMaterial);
+ uberActive |= TryPrepareUberImageEffect(m_Dithering, uberMaterial);
+
+ if (uberActive)
+ {
+ if (!GraphicsUtils.isLinearColorSpace)
+ uberMaterial.EnableKeyword("UNITY_COLORSPACE_GAMMA");
+
+ Graphics.Blit(src, dst, uberMaterial, 0);
+ }
+ }
+
+ if (!uberActive && !fxaaActive)
+ Graphics.Blit(src, dst);
+
+#if UNITY_EDITOR
+ if (profile.monitors.onFrameEndEditorOnly != null)
+ {
+ Graphics.Blit(dst, destination);
+
+ var oldRt = RenderTexture.active;
+ profile.monitors.onFrameEndEditorOnly(dst);
+ RenderTexture.active = oldRt;
+ }
+#endif
+
+ m_RenderTextureFactory.ReleaseAll();
+ }
+
+ void OnGUI()
+ {
+ if (!this.enabled)
+ {
+ return;
+ }
+
+ if (Event.current.type != EventType.Repaint)
+ return;
+
+ if (profile == null || m_Camera == null)
+ return;
+
+ if (m_EyeAdaptation.active && profile.debugViews.IsModeActive(DebugMode.EyeAdaptation))
+ m_EyeAdaptation.OnGUI();
+ else if (m_ColorGrading.active && profile.debugViews.IsModeActive(DebugMode.LogLut))
+ m_ColorGrading.OnGUI();
+ else if (m_UserLut.active && profile.debugViews.IsModeActive(DebugMode.UserLut))
+ m_UserLut.OnGUI();
+ }
+
+ void OnDisable()
+ {
+ // Clear command buffers
+ foreach (var cb in m_CommandBuffers.Values)
+ {
+ m_Camera.RemoveCommandBuffer(cb.Key, cb.Value);
+ cb.Value.Dispose();
+ }
+
+ m_CommandBuffers.Clear();
+
+ // Clear components
+ if (profile != null)
+ DisableComponents();
+
+ m_Components.Clear();
+
+ // Factories
+ m_MaterialFactory.Dispose();
+ m_RenderTextureFactory.Dispose();
+ GraphicsUtils.Dispose();
+ }
+
+ public void ResetTemporalEffects()
+ {
+ m_Taa.ResetHistory();
+ m_MotionBlur.ResetHistory();
+ m_EyeAdaptation.ResetHistory();
+ }
+
+ #region State management
+
+ List<PostProcessingComponentBase> m_ComponentsToEnable = new List<PostProcessingComponentBase>();
+ List<PostProcessingComponentBase> m_ComponentsToDisable = new List<PostProcessingComponentBase>();
+
+ void CheckObservers()
+ {
+ foreach (var cs in m_ComponentStates)
+ {
+ var component = cs.Key;
+ var state = component.GetModel().enabled;
+
+ if (state != cs.Value)
+ {
+ if (state) m_ComponentsToEnable.Add(component);
+ else m_ComponentsToDisable.Add(component);
+ }
+ }
+
+ for (int i = 0; i < m_ComponentsToDisable.Count; i++)
+ {
+ var c = m_ComponentsToDisable[i];
+ m_ComponentStates[c] = false;
+ c.OnDisable();
+ }
+
+ for (int i = 0; i < m_ComponentsToEnable.Count; i++)
+ {
+ var c = m_ComponentsToEnable[i];
+ m_ComponentStates[c] = true;
+ c.OnEnable();
+ }
+
+ m_ComponentsToDisable.Clear();
+ m_ComponentsToEnable.Clear();
+ }
+
+ void DisableComponents()
+ {
+ foreach (var component in m_Components)
+ {
+ var model = component.GetModel();
+ if (model != null && model.enabled)
+ component.OnDisable();
+ }
+ }
+
+ #endregion
+
+ #region Command buffer handling & rendering helpers
+ // Placeholders before the upcoming Scriptable Render Loop as command buffers will be
+ // executed on the go so we won't need of all that stuff
+ CommandBuffer AddCommandBuffer<T>(CameraEvent evt, string name)
+ where T : PostProcessingModel
+ {
+ var cb = new CommandBuffer { name = name };
+ var kvp = new KeyValuePair<CameraEvent, CommandBuffer>(evt, cb);
+ m_CommandBuffers.Add(typeof(T), kvp);
+ m_Camera.AddCommandBuffer(evt, kvp.Value);
+ return kvp.Value;
+ }
+
+ void RemoveCommandBuffer<T>()
+ where T : PostProcessingModel
+ {
+ KeyValuePair<CameraEvent, CommandBuffer> kvp;
+ var type = typeof(T);
+
+ if (!m_CommandBuffers.TryGetValue(type, out kvp))
+ return;
+
+ m_Camera.RemoveCommandBuffer(kvp.Key, kvp.Value);
+ m_CommandBuffers.Remove(type);
+ kvp.Value.Dispose();
+ }
+
+ CommandBuffer GetCommandBuffer<T>(CameraEvent evt, string name)
+ where T : PostProcessingModel
+ {
+ CommandBuffer cb;
+ KeyValuePair<CameraEvent, CommandBuffer> kvp;
+
+ if (!m_CommandBuffers.TryGetValue(typeof(T), out kvp))
+ {
+ cb = AddCommandBuffer<T>(evt, name);
+ }
+ else if (kvp.Key != evt)
+ {
+ RemoveCommandBuffer<T>();
+ cb = AddCommandBuffer<T>(evt, name);
+ }
+ else cb = kvp.Value;
+
+ return cb;
+ }
+
+ void TryExecuteCommandBuffer<T>(PostProcessingComponentCommandBuffer<T> component)
+ where T : PostProcessingModel
+ {
+ if (component.active)
+ {
+ var cb = GetCommandBuffer<T>(component.GetCameraEvent(), component.GetName());
+ cb.Clear();
+ component.PopulateCommandBuffer(cb);
+ }
+ else RemoveCommandBuffer<T>();
+ }
+
+ bool TryPrepareUberImageEffect<T>(PostProcessingComponentRenderTexture<T> component, Material material)
+ where T : PostProcessingModel
+ {
+ if (!component.active)
+ return false;
+
+ component.Prepare(material);
+ return true;
+ }
+
+ T AddComponent<T>(T component)
+ where T : PostProcessingComponentBase
+ {
+ m_Components.Add(component);
+ return component;
+ }
+
+ #endregion
+ }
+}
--
Gitblit v1.8.0