From b5645c779a3e3c4ca758400cd9a718a7bc0c2bc6 Mon Sep 17 00:00:00 2001 From: chai Date: Mon, 20 Sep 2021 22:44:08 +0800 Subject: *command buffer --- Assets/Scripts/Unit/LensEffect/LensEffectBase.cs | 101 +++++++++++++ .../Scripts/Unit/LensEffect/LensEffectBase.cs.meta | 11 ++ .../Scripts/Unit/LensEffect/LensEffect_Glitch.cs | 18 +++ .../Unit/LensEffect/LensEffect_Glitch.cs.meta | 11 ++ .../Unit/LensEffect/LensEffect_MotionBlur.cs | 64 ++++++++ .../Unit/LensEffect/LensEffect_MotionBlur.cs.meta | 11 ++ Assets/Scripts/Unit/LensEffect/LensEffects.cs | 166 --------------------- Assets/Scripts/Unit/LensEffect/LensEffects.cs.meta | 11 -- 8 files changed, 216 insertions(+), 177 deletions(-) create mode 100644 Assets/Scripts/Unit/LensEffect/LensEffectBase.cs create mode 100644 Assets/Scripts/Unit/LensEffect/LensEffectBase.cs.meta create mode 100644 Assets/Scripts/Unit/LensEffect/LensEffect_Glitch.cs create mode 100644 Assets/Scripts/Unit/LensEffect/LensEffect_Glitch.cs.meta create mode 100644 Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs create mode 100644 Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs.meta delete mode 100644 Assets/Scripts/Unit/LensEffect/LensEffects.cs delete mode 100644 Assets/Scripts/Unit/LensEffect/LensEffects.cs.meta (limited to 'Assets/Scripts/Unit/LensEffect') 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> m_MaterailPool = new Dictionary>(); + + private List m_InUseMaterials = new List(); + + private static MaterialEntry _ClaimMaterial(string shader) + { + List 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 mats; + if (!m_MaterailPool.TryGetValue(entry.shader, out mats)) + { + mats = new List(); + 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/Unit/LensEffect/LensEffectBase.cs.meta b/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs.meta new file mode 100644 index 00000000..d0d0d81b --- /dev/null +++ b/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 548560041d20266478078df50edab4e9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: 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().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> m_MaterailPool; - - public static LensEffect Create(Func create) - { - return create(); - } - - static LensEffect() - { - m_MaterailPool = new Dictionary>(); - } - - static MaterialEntry ClaimMaterial(string shader) - { - List 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 mats; - if (!m_MaterailPool.TryGetValue(entry.shader, out mats)) - { - mats = new List(); - m_MaterailPool.Add(entry.shader, mats); - } - mats.Add(entry); - } - - #region LensEffects - - public static LensEffect MotionBlur() - { - LensEffect eff = LensEffect.Create(() => - { - LensEffect e = new LensEffect(); - - List materials = ListPool.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().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 -} diff --git a/Assets/Scripts/Unit/LensEffect/LensEffects.cs.meta b/Assets/Scripts/Unit/LensEffect/LensEffects.cs.meta deleted file mode 100644 index ec32bb75..00000000 --- a/Assets/Scripts/Unit/LensEffect/LensEffects.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c5acf04ae1e72ed42a1d20ee038ac73e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: -- cgit v1.1-26-g67d0