diff options
author | chai <chaifix@163.com> | 2021-09-20 22:44:08 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-09-20 22:44:08 +0800 |
commit | b5645c779a3e3c4ca758400cd9a718a7bc0c2bc6 (patch) | |
tree | 828efe2db3a371499e34ee6c2126cdb8d95f2244 /Assets/Scripts | |
parent | 4551d1d12fc3029fcf553cfdeb10402e42de705d (diff) |
*command buffer
Diffstat (limited to 'Assets/Scripts')
19 files changed, 450 insertions, 251 deletions
diff --git a/Assets/Scripts/Camera/CustomRenderingPipeline.cs b/Assets/Scripts/Camera/CustomRenderingPipeline.cs new file mode 100644 index 00000000..c11cc785 --- /dev/null +++ b/Assets/Scripts/Camera/CustomRenderingPipeline.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering; +
+// https://docs.unity3d.com/ScriptReference/Rendering.CameraEvent.html
+// 前向渲染的camera events
+// * DepthTexture
+// * DepthNormalTexture
+// * ForwardOpaque
+// * ImageEffectsOpaque
+// * Skybox
+// * ForwardAlpha
+// * ImageEffects
+// * Everything
+ +[Flags] +public enum ERenderingEvent
+{
+ None = 0,
+ BeforeDepthTexture = 1,
+ BeforeDepthNormalsTexture = 1 << 1,
+ BeforeForwardOpaque = 1 << 2,
+ BeforeImageEffectsOpaque = 1 << 3,
+ BeforeSkybox = 1 << 4,
+ BeforeForwardAlpha = 1 << 5,
+ BeforeImageEffects = 1 << 6,
+ //BeforeEverything = 1 << 7,
+ AfterDepthTexture = 1 << 8,
+ AfterDepthNormalsTexture = 1 << 9,
+ AfterForwardOpaque = 1 << 10,
+ AfterImageEffectsOpaque = 1 << 11,
+ AfterSkybox = 1 << 12,
+ AfterForwardAlpha = 1 << 13,
+ AfterImageEffects = 1 << 14,
+ AfterEverything = 1 << 15,
+} + +[RequireComponent(typeof(MainCamera))] +public class CustomRenderingPipeline : MonoBehaviour +{
+ public static Dictionary<ERenderingEvent, CameraEvent> RenderingEventToCameraEvent = new Dictionary<ERenderingEvent, CameraEvent> {
+ {ERenderingEvent.BeforeDepthTexture, CameraEvent.BeforeDepthTexture },
+ {ERenderingEvent.BeforeDepthNormalsTexture, CameraEvent.BeforeDepthNormalsTexture },
+ {ERenderingEvent.BeforeForwardOpaque, CameraEvent.BeforeForwardOpaque },
+ {ERenderingEvent.BeforeImageEffectsOpaque, CameraEvent.BeforeImageEffectsOpaque },
+ {ERenderingEvent.BeforeSkybox, CameraEvent.BeforeSkybox },
+ {ERenderingEvent.BeforeForwardAlpha, CameraEvent.BeforeForwardAlpha },
+ {ERenderingEvent.BeforeImageEffects, CameraEvent.BeforeImageEffects },
+ {ERenderingEvent.AfterDepthTexture, CameraEvent.AfterDepthTexture },
+ {ERenderingEvent.AfterDepthNormalsTexture, CameraEvent.AfterDepthNormalsTexture },
+ {ERenderingEvent.AfterForwardOpaque, CameraEvent.AfterForwardOpaque },
+ {ERenderingEvent.AfterImageEffectsOpaque, CameraEvent.AfterImageEffectsOpaque },
+ {ERenderingEvent.AfterSkybox, CameraEvent.AfterSkybox },
+ {ERenderingEvent.AfterForwardAlpha, CameraEvent.AfterForwardAlpha },
+ {ERenderingEvent.AfterImageEffects, CameraEvent.AfterImageEffects },
+ {ERenderingEvent.AfterEverything, CameraEvent.AfterEverything },
+ };
+
+ Camera m_Camera;
+
+ public delegate void RenderEventHandler();
+ public event RenderEventHandler onPreCull;
+ public event RenderEventHandler onPreRender;
+ public event RenderEventHandler onPostRender;
+
+ private void OnEable()
+ {
+ m_Camera = GetComponent<Camera>();
+ } + + private void Start()
+ {
+
+ }
+
+ private void OnPreCull()
+ {
+ onPreCull?.Invoke();
+ }
+
+ private void OnPreRender()
+ {
+ onPreRender?.Invoke();
+ }
+
+ private void OnPostRender()
+ {
+ onPostRender?.Invoke();
+ }
+
+ #region 贴图
+
+ #endregion
+
+
+
+}
\ No newline at end of file diff --git a/Assets/Scripts/Unit/LensEffect/LensEffects.cs.meta b/Assets/Scripts/Camera/CustomRenderingPipeline.cs.meta index ec32bb75..1a3cac2c 100644 --- a/Assets/Scripts/Unit/LensEffect/LensEffects.cs.meta +++ b/Assets/Scripts/Camera/CustomRenderingPipeline.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: c5acf04ae1e72ed42a1d20ee038ac73e +guid: aaca34c56e4ce4f41a13d30db14959aa MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Scripts/Camera/LensEffectHandler.cs b/Assets/Scripts/Camera/LensEffectHandler.cs deleted file mode 100644 index 63114535..00000000 --- a/Assets/Scripts/Camera/LensEffectHandler.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -[RequireComponent(typeof(Camera))] -public class LensEffectHandler : MonoBehaviour -{ - Camera m_Camera; - - public delegate void RenderEventHandler(); - public event RenderEventHandler onPreCull; - public event RenderEventHandler onPreRender; - public event RenderEventHandler onPostRender; - - private void OnEable() - { - m_Camera = GetComponent<Camera>(); - } - - private void OnPreCull() - { - onPreCull?.Invoke(); - } - - private void OnPreRender() - { - onPreRender?.Invoke(); - } - - private void OnPostRender() - { - onPostRender?.Invoke(); - } - -} diff --git a/Assets/Scripts/Camera/MainCamera.cs b/Assets/Scripts/Camera/MainCamera.cs index f439cf22..4d65fa18 100644 --- a/Assets/Scripts/Camera/MainCamera.cs +++ b/Assets/Scripts/Camera/MainCamera.cs @@ -5,6 +5,7 @@ using UnityEngine; // 主相机 [ExecuteAlways] +[RequireComponent(typeof(Camera))] public class MainCamera : SingletonMB<MainCamera> { #region inspector @@ -32,14 +33,14 @@ public class MainCamera : SingletonMB<MainCamera> [SerializeField] private float threshold; #endregion - private LensEffectHandler m_LensEffectHandler; - public LensEffectHandler lensEffectHandler - { + private CustomRenderingPipeline m_CustomRenderingPipeline; + public CustomRenderingPipeline customRenderingPipeline
+ { get { - if (m_LensEffectHandler == null) - m_LensEffectHandler = this.gameObject.GetOrAddComponent<LensEffectHandler>(); - return m_LensEffectHandler; + if (m_CustomRenderingPipeline == null)
+ m_CustomRenderingPipeline = this.gameObject.GetOrAddComponent<CustomRenderingPipeline>(); + return m_CustomRenderingPipeline; } } diff --git a/Assets/Scripts/Scene.meta b/Assets/Scripts/Curve3D.meta index eb7a8716..fef1c5e7 100644 --- a/Assets/Scripts/Scene.meta +++ b/Assets/Scripts/Curve3D.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: eaee2d0f48cff9b40baf0686a8105600 +guid: ad8b718b6b700d8419838dad07158567 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Scripts/Drone.meta b/Assets/Scripts/Drone.meta new file mode 100644 index 00000000..694cff70 --- /dev/null +++ b/Assets/Scripts/Drone.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ec3412151f8a72a41b2ed21316763399 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Managers/Physics.meta b/Assets/Scripts/Managers/Physics.meta new file mode 100644 index 00000000..2296b3f8 --- /dev/null +++ b/Assets/Scripts/Managers/Physics.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 603d4624aaedd794cb89497954a83f4a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Props.meta b/Assets/Scripts/Props.meta new file mode 100644 index 00000000..bb96602e --- /dev/null +++ b/Assets/Scripts/Props.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f299520ed9fcf4a45858ad4ef5a8d5d1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Robot.meta b/Assets/Scripts/Robot.meta new file mode 100644 index 00000000..0b5a087e --- /dev/null +++ b/Assets/Scripts/Robot.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7c09ca1609552d24bbe697d1516f8aa9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Unit/AI/Actions.meta b/Assets/Scripts/Unit/AI/Actions.meta new file mode 100644 index 00000000..9b4ad463 --- /dev/null +++ b/Assets/Scripts/Unit/AI/Actions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 971e9d55b8bc0894eb6a110fb962000b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Unit/AI/Conditionals.meta b/Assets/Scripts/Unit/AI/Conditionals.meta new file mode 100644 index 00000000..70a86da5 --- /dev/null +++ b/Assets/Scripts/Unit/AI/Conditionals.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 85b7e0c7ed1d12f42a5178bfbf3d934c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Unit/Components/UnitLensEffect.cs b/Assets/Scripts/Unit/Components/UnitLensEffect.cs index 5a6a309e..18328fc8 100644 --- a/Assets/Scripts/Unit/Components/UnitLensEffect.cs +++ b/Assets/Scripts/Unit/Components/UnitLensEffect.cs @@ -1,4 +1,5 @@ using System; +using System.Reflection; using System.Collections; using System.Collections.Generic; using UnityEngine; @@ -14,11 +15,12 @@ public class UnitLensEffect : UnitComponent private static ObjectPool<CommandBuffer> m_CommandBufferPool; - private List<LensEffect> m_Effects; + private List<LensEffectBase> m_Effects; - private CommandBuffer m_CommandBuffer; - - static UnitLensEffect() + private Dictionary<ERenderingEvent, CommandBuffer> m_InUseCommandBuffers;
+ private Dictionary<ERenderingEvent, CommandBuffer> m_CachedCommandBuffers;
+
+ static UnitLensEffect() { m_CommandBufferPool = new ObjectPool<CommandBuffer>(null, null); } @@ -28,8 +30,10 @@ public class UnitLensEffect : UnitComponent base.Initialize(); renderers = new List<RendererProxy>(); - m_Effects = new List<LensEffect>(); - } + m_Effects = new List<LensEffectBase>(); + m_InUseCommandBuffers = new Dictionary<ERenderingEvent, CommandBuffer>(); + m_CachedCommandBuffers = new Dictionary<ERenderingEvent, CommandBuffer>(); + } public override void OnPostInitialize() { @@ -50,58 +54,68 @@ public class UnitLensEffect : UnitComponent renderers.Add(proxy); } - m_CommandBuffer = ClaimCommandBuffer(); - m_CommandBuffer.name = "Unit Render"; - - MainCamera.Instance.lensEffectHandler.onPreCull += OnWillRenderUnit; - MainCamera.Instance.lensEffectHandler.onPostRender += OnRenderUnit; + MainCamera.Instance.customRenderingPipeline.onPreCull += OnWillRenderUnit; + MainCamera.Instance.customRenderingPipeline.onPostRender += OnRenderUnit; ///// - m_Effects.Add(LensEffect.MotionBlur()); + m_Effects.Add(new LensEffect_MotionBlur()); } public override void Release() { base.Release(); - MainCamera.Instance.lensEffectHandler.onPreRender -= OnWillRenderUnit; - MainCamera.Instance.lensEffectHandler.onPostRender -= OnRenderUnit; + MainCamera.Instance.customRenderingPipeline.onPreRender -= OnWillRenderUnit; + MainCamera.Instance.customRenderingPipeline.onPostRender -= OnRenderUnit; } private void OnWillRenderUnit() { - IBodyRendererAgent body = owner.unitRender.body; + PrepareCommandBuffers(); +
+ IBodyRendererAgent body = owner.unitRender.body; if (body == null || body.renderers == null) return; if (m_Effects == null || m_Effects.Count == 0) - return; - - m_CommandBuffer.Clear(); - - for (int i = 0; i < m_Effects.Count; ++i) - { - m_Effects[i].beforeIterate(m_CommandBuffer); - for (int j = 0; j < body.renderers.Length; ++j) - { - var renderer = body.renderers[j]; - if (renderer == null) - continue; - m_Effects[i].iterate(m_CommandBuffer,renderer); - } - m_Effects[i].afterIterate(m_CommandBuffer); - } - - MainCamera.Instance.camera.AddCommandBuffer(CameraEvent.AfterImageEffectsOpaque, m_CommandBuffer); + return;
+ foreach (var cb in m_InUseCommandBuffers)
+ {
+ cb.Value.Clear();
+ ERenderingEvent re = cb.Key;
+ CameraEvent ce = CustomRenderingPipeline.RenderingEventToCameraEvent[re];
+ for (int i = 0; i < m_Effects.Count; ++i)
+ {
+ LensEffectBase eff = m_Effects[i];
+ if (!eff.renderingEvents.HasFlag(re))
+ continue;
+ MethodInfo method = eff.GetType().GetMethod(re.ToString(), BindingFlags.Instance | BindingFlags.Public, null, new Type[] { typeof(LensEffectBase.EStage), typeof(CommandBuffer), typeof(BodyPartRenderer) }, null);
+ if (method == null)
+ continue;
+ method.Invoke(eff, new object[] { LensEffectBase.EStage.Before, cb.Value, null });
+ for (int j = 0; j < body.renderers.Length; ++j)
+ {
+ var renderer = body.renderers[j];
+ if (renderer == null)
+ continue;
+ method.Invoke(eff, new object[] { LensEffectBase.EStage.Iterate, cb.Value, renderer });
+ }
+ method.Invoke(eff, new object[] { LensEffectBase.EStage.After, cb.Value, null });
+ } + MainCamera.Instance.camera.AddCommandBuffer(ce, cb.Value); + }
} private void OnRenderUnit() - { - MainCamera.Instance.camera.RemoveCommandBuffer(CameraEvent.AfterImageEffectsOpaque, m_CommandBuffer); - for(int i = 0; i < m_Effects.Count; ++i) - { - m_Effects[i].finishRender?.Invoke(); - } - } + {
+ foreach(var cb in m_InUseCommandBuffers)
+ {
+ CameraEvent ce = CustomRenderingPipeline.RenderingEventToCameraEvent[cb.Key];
+ MainCamera.Instance.camera.RemoveCommandBuffer(ce, cb.Value); + }
+ var temp = m_CachedCommandBuffers; + m_CachedCommandBuffers = m_InUseCommandBuffers;
+ m_InUseCommandBuffers = temp;
+ } private void OnWillRenderObj(BodyPartRenderer renderer) { @@ -111,7 +125,40 @@ public class UnitLensEffect : UnitComponent { } - static CommandBuffer ClaimCommandBuffer() + void PrepareCommandBuffers()
+ {
+ ERenderingEvent usedEvent = ERenderingEvent.None; + for (int i = 0; i < m_Effects.Count; ++i)
+ {
+ usedEvent |= m_Effects[i].renderingEvents;
+ }
+ foreach(ERenderingEvent evt in Enum.GetValues(typeof(ERenderingEvent)))
+ {
+ if (evt == ERenderingEvent.None)
+ continue;
+ if(usedEvent.HasFlag(evt))
+ {
+ CommandBuffer cb;
+ if(m_CachedCommandBuffers.TryGetValue(evt, out cb))
+ {
+ m_CachedCommandBuffers.Remove(evt);
+ }
+ else
+ {
+ cb = m_CommandBufferPool.Get();
+ cb.name = evt.ToString();
+ }
+ m_InUseCommandBuffers.Add(evt, cb);
+ }
+ }
+ foreach(var cb in m_CachedCommandBuffers)
+ {
+ m_CommandBufferPool.Release(cb.Value);
+ }
+ m_CachedCommandBuffers.Clear();
+ }
+
+ static CommandBuffer ClaimCommandBuffer() { CommandBuffer cb = m_CommandBufferPool.Get(); cb.Clear(); diff --git a/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs b/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs new file mode 100644 index 00000000..08e20217 --- /dev/null +++ b/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs @@ -0,0 +1,101 @@ +using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.Rendering;
+
+public class MaterialEntry
+{
+ public string shader;
+ public Material material;
+}
+
+public abstract class LensEffectBase : MonoBehaviour
+{
+ public enum EStage
+ {
+ Before ,
+ Iterate ,
+ After ,
+ Finished ,
+ }
+
+ public abstract ERenderingEvent renderingEvents { get; }
+
+ protected static Dictionary<string/*shaderName*/, List<MaterialEntry>> m_MaterailPool = new Dictionary<string, List<MaterialEntry>>();
+
+ private List<MaterialEntry> m_InUseMaterials = new List<MaterialEntry>();
+
+ private static MaterialEntry _ClaimMaterial(string shader)
+ {
+ List<MaterialEntry> mats;
+ if (m_MaterailPool.TryGetValue(shader, out mats) && mats.Count > 0)
+ {
+ MaterialEntry me = mats[mats.Count - 1];
+ mats.RemoveAt(mats.Count - 1);
+ return me;
+ }
+ Material mat = new Material(Shader.Find(shader));
+ MaterialEntry entry = new MaterialEntry();
+ entry.material = mat;
+ entry.shader = shader;
+ return entry;
+ }
+
+ private static void _ReleaseMaterial(MaterialEntry entry)
+ {
+ List<MaterialEntry> mats;
+ if (!m_MaterailPool.TryGetValue(entry.shader, out mats))
+ {
+ mats = new List<MaterialEntry>();
+ m_MaterailPool.Add(entry.shader, mats);
+ }
+ mats.Add(entry);
+ } + + protected MaterialEntry ClaimMaterial(string shader)
+ {
+ MaterialEntry entry = _ClaimMaterial(shader);
+ m_InUseMaterials.Add(entry);
+ return entry;
+ } + + protected void ReleaseMaterial(MaterialEntry entry)
+ {
+ m_InUseMaterials.Remove(entry);
+ _ReleaseMaterial(entry);
+ } + + protected void ReleaseAllInUsedMaterials()
+ {
+ for(int i = 0; i < m_InUseMaterials.Count; ++i)
+ {
+ _ReleaseMaterial(m_InUseMaterials[i]);
+ }
+ m_InUseMaterials.Clear();
+ } +
+ public virtual void BeforeDepthTexture(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+ public virtual void AfterDepthTexture(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+
+ public virtual void BeforeDepthNormalsTexture(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+ public virtual void AfterDepthNormalsTexture(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+
+ public virtual void BeforeForwardOpaque(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+ public virtual void AfterForwardOpaque(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+
+ public virtual void BeforeImageEffectsOpaque(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+ public virtual void AfterImageEffectsOpaque(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+
+ public virtual void BeforeSkybox(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+ public virtual void AfterSkybox(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+
+ public virtual void BeforeForwardAlpha(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+ public virtual void AfterForwardAlpha(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+
+ public virtual void BeforeImageEffects(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+ public virtual void AfterImageEffects(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+
+ public virtual void BeforeEverything(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+ public virtual void AfterEverything(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+
+}
\ No newline at end of file diff --git a/Assets/Scripts/Camera/LensEffectHandler.cs.meta b/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs.meta index cf914200..d0d0d81b 100644 --- a/Assets/Scripts/Camera/LensEffectHandler.cs.meta +++ b/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 058dffdf2041d7d43902a7c301296bb2 +guid: 548560041d20266478078df50edab4e9 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Scripts/Unit/LensEffect/LensEffect_Glitch.cs b/Assets/Scripts/Unit/LensEffect/LensEffect_Glitch.cs new file mode 100644 index 00000000..00763a37 --- /dev/null +++ b/Assets/Scripts/Unit/LensEffect/LensEffect_Glitch.cs @@ -0,0 +1,18 @@ +using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class LensEffect_Glitch : MonoBehaviour
+{
+ // Start is called before the first frame update
+ void Start()
+ {
+
+ }
+
+ // Update is called once per frame
+ void Update()
+ {
+
+ }
+}
diff --git a/Assets/Scripts/Unit/LensEffect/LensEffect_Glitch.cs.meta b/Assets/Scripts/Unit/LensEffect/LensEffect_Glitch.cs.meta new file mode 100644 index 00000000..88e5b0de --- /dev/null +++ b/Assets/Scripts/Unit/LensEffect/LensEffect_Glitch.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 48bd0d7bffad03a44a281ccb6f21f188 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs b/Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs new file mode 100644 index 00000000..9ec7d056 --- /dev/null +++ b/Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs @@ -0,0 +1,64 @@ +using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.Rendering;
+
+public class LensEffect_MotionBlur : LensEffectBase
+{
+ int tempID;
+
+ public LensEffect_MotionBlur()
+ {
+ }
+
+ public override ERenderingEvent renderingEvents => ERenderingEvent.AfterImageEffectsOpaque;
+
+ public override void AfterImageEffectsOpaque(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null)
+ {
+ if(stage == EStage.Before)
+ {
+ tempID = Shader.PropertyToID("_Temp1");
+
+ cb.GetTemporaryRT(tempID, -1, -1, 24, FilterMode.Bilinear);
+ cb.SetRenderTarget(tempID);
+ cb.ClearRenderTarget(true, true, new Color(0, 0, 0, 0)); + }
+ else if(stage == EStage.Iterate)
+ {
+ Matrix4x4 obj2Wod = Matrix4x4.identity;
+ int subMeshCount = 0;
+ if (renderer.renderer is SkinnedMeshRenderer)
+ {
+ SkinnedMeshRenderer smr = renderer.renderer as SkinnedMeshRenderer;
+ Vector3 pos = smr.rootBone.transform.position;
+ Quaternion rot = smr.rootBone.transform.rotation;
+ obj2Wod = MatrixUtility.RotateAndTranslate(pos, rot);
+ subMeshCount = smr.sharedMesh.subMeshCount;
+ }
+ else if (renderer.renderer is MeshRenderer)
+ {
+ obj2Wod = renderer.renderer.transform.localToWorldMatrix;
+ subMeshCount = renderer.renderer.GetComponent<MeshFilter>().sharedMesh.subMeshCount;
+ }
+
+ for (int i = 0; i < subMeshCount; ++i)
+ {
+ MaterialEntry mat = ClaimMaterial(StaticDefine.shaders[EShader.SolidColor].name);
+ mat.material.SetColor("_Color", Color.red);
+ mat.material.SetMatrix("_ObjectToWorld", obj2Wod);
+
+ cb.DrawRenderer(renderer.renderer, mat.material, i);
+ } + }
+ else if(stage == EStage.After)
+ {
+ MaterialEntry blur = ClaimMaterial(StaticDefine.shaders[EShader.Blur].name);
+ cb.Blit(tempID, BuiltinRenderTextureType.CameraTarget, blur.material); + }
+ else if(stage == EStage.Finished)
+ {
+ ReleaseAllInUsedMaterials();
+ }
+ }
+
+}
\ No newline at end of file diff --git a/Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs.meta b/Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs.meta new file mode 100644 index 00000000..364e3d30 --- /dev/null +++ b/Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 499c4e25bc0f4d641b99f688e91c495f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Unit/LensEffect/LensEffects.cs b/Assets/Scripts/Unit/LensEffect/LensEffects.cs deleted file mode 100644 index 4083eb88..00000000 --- a/Assets/Scripts/Unit/LensEffect/LensEffects.cs +++ /dev/null @@ -1,166 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.Rendering; - -public class MaterialEntry -{ - public Material material; - public string shader; -} - -public struct ScaleOffset -{ - public Vector2 scale; - public Vector2 offset; -} - -public class LensEffect -{ - #region callbacks - public delegate void BeforeIterateHandler(CommandBuffer cb); - public BeforeIterateHandler beforeIterate; - - public delegate void IterationHandler(CommandBuffer cb, BodyPartRenderer renderer); - public IterationHandler iterate; - - public delegate void AfterIterateHandler(CommandBuffer cb); - public AfterIterateHandler afterIterate; - - // 这一帧的这个特效结束 - public delegate void FinishRenderHandler(); - public FinishRenderHandler finishRender; - #endregion - - private static Dictionary<string/*shaderName*/, List<MaterialEntry>> m_MaterailPool; - - public static LensEffect Create(Func<LensEffect> create) - { - return create(); - } - - static LensEffect() - { - m_MaterailPool = new Dictionary<string, List<MaterialEntry>>(); - } - - static MaterialEntry ClaimMaterial(string shader) - { - List<MaterialEntry> mats; - if (m_MaterailPool.TryGetValue(shader, out mats) && mats.Count > 0) - { - MaterialEntry me = mats[mats.Count - 1]; - mats.RemoveAt(mats.Count - 1); - return me; - } - Material mat = new Material(Shader.Find(shader)); - MaterialEntry entry = new MaterialEntry(); - entry.material = mat; - entry.shader = shader; - return entry; - } - - static void ReleaseMaterial(MaterialEntry entry) - { - List<MaterialEntry> mats; - if (!m_MaterailPool.TryGetValue(entry.shader, out mats)) - { - mats = new List<MaterialEntry>(); - m_MaterailPool.Add(entry.shader, mats); - } - mats.Add(entry); - } - - #region LensEffects - - public static LensEffect MotionBlur() - { - LensEffect eff = LensEffect.Create(() => - { - LensEffect e = new LensEffect(); - - List<MaterialEntry> materials = ListPool<MaterialEntry>.Get(); - int tempID = Shader.PropertyToID("_Temp1"); - - ScaleOffset scaleOffset = new ScaleOffset(); - - e.beforeIterate = (CommandBuffer cb) => - { - cb.GetTemporaryRT(tempID, -1, -1, 24, FilterMode.Bilinear); - cb.SetRenderTarget(tempID); - cb.ClearRenderTarget(true, true, new Color(0, 0, 0, 0)); - }; - e.iterate = (CommandBuffer cb, BodyPartRenderer renderer) => - { - Matrix4x4 obj2Wod = Matrix4x4.identity; - int subMeshCount = 0; - if (renderer.renderer is SkinnedMeshRenderer) - { - SkinnedMeshRenderer smr = renderer.renderer as SkinnedMeshRenderer; - Vector3 pos = smr.rootBone.transform.position; - Quaternion rot = smr.rootBone.transform.rotation; - obj2Wod = MatrixUtility.RotateAndTranslate(pos, rot); - subMeshCount = smr.sharedMesh.subMeshCount; - } - else if (renderer.renderer is MeshRenderer) - { - obj2Wod = renderer.renderer.transform.localToWorldMatrix; - subMeshCount = renderer.renderer.GetComponent<MeshFilter>().sharedMesh.subMeshCount; - } - - for (int i = 0; i < subMeshCount; ++i) - { - MaterialEntry mat = ClaimMaterial(StaticDefine.shaders[EShader.SolidColor].name); - materials.Add(mat); - mat.material.SetColor("_Color", Color.red); - mat.material.SetMatrix("_ObjectToWorld", obj2Wod); - - cb.DrawRenderer(renderer.renderer, mat.material, i); - } - }; - e.afterIterate = (CommandBuffer cb) => - { - MaterialEntry blur = ClaimMaterial(StaticDefine.shaders[EShader.Blur].name); - materials.Add(blur); - - cb.Blit(tempID, BuiltinRenderTextureType.CameraTarget, blur.material); - }; - e.finishRender = () => - { - for (int i = materials.Count - 1; i >= 0; --i) - { - MaterialEntry mat = materials[i]; - ReleaseMaterial(mat); - materials.RemoveAt(i); - } - }; - return e; - }); - return eff; - } - - public static LensEffect Glitch() - { - - return null; - } - - public static LensEffect OutLine() - { - - return null; - } - - public static LensEffect RimLight() - { - return null; - } - - public static LensEffect Decals() - { - return null; - } - - #endregion -} |