From 2f310aa9f3f1cb1d51e8f62a6d5e3dda4821b82b Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 22 Sep 2021 19:25:56 +0800 Subject: *effect --- Assets/Scripts/Camera/CameraUtility.cs | 49 ++++++++++++++ Assets/Scripts/Camera/CameraUtility.cs.meta | 11 ++++ Assets/Scripts/Rendering/RenderingUtility.cs | 27 ++++++++ Assets/Scripts/Unit/Components/UnitLensEffect.cs | 4 +- Assets/Scripts/Unit/Controller/UnitController.cs | 32 +++++++++ Assets/Scripts/Unit/LensEffect/LensEffectBase.cs | 2 + .../Scripts/Unit/LensEffect/LensEffect_BlurRim.cs | 76 ++++++++++++++++++++++ .../Unit/LensEffect/LensEffect_BlurRim.cs.meta | 11 ++++ .../Unit/LensEffect/LensEffect_MotionBlur.cs | 4 ++ Assets/Scripts/Utils/VectorUtility.cs | 32 +++++++++ Assets/Scripts/Utils/VectorUtility.cs.meta | 11 ++++ 11 files changed, 258 insertions(+), 1 deletion(-) create mode 100644 Assets/Scripts/Camera/CameraUtility.cs create mode 100644 Assets/Scripts/Camera/CameraUtility.cs.meta create mode 100644 Assets/Scripts/Unit/LensEffect/LensEffect_BlurRim.cs create mode 100644 Assets/Scripts/Unit/LensEffect/LensEffect_BlurRim.cs.meta create mode 100644 Assets/Scripts/Utils/VectorUtility.cs create mode 100644 Assets/Scripts/Utils/VectorUtility.cs.meta (limited to 'Assets/Scripts') diff --git a/Assets/Scripts/Camera/CameraUtility.cs b/Assets/Scripts/Camera/CameraUtility.cs new file mode 100644 index 00000000..1f6c10e6 --- /dev/null +++ b/Assets/Scripts/Camera/CameraUtility.cs @@ -0,0 +1,49 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public static class CameraExtend +{ + + public static Vector3 WorldToCameraSpace(this Camera camera, Vector3 worldPos) + { + Vector4 camPos = camera.worldToCameraMatrix * worldPos.ToVector4(); + return camPos.ToVector3(); + } + + public static Vector3 CameraToViewportSpace(this Camera camera, Vector3 camPos) + { + Matrix4x4 proj = GL.GetGPUProjectionMatrix(camera.projectionMatrix, false); + Vector4 clipPos = proj * camPos.ToVector4(); + Vector3 ndcPos = (clipPos / clipPos.w); + Vector3 viewPos = (ndcPos + Vector3.one) / 2f; + return viewPos; + } + + public static Vector3 CameraToScreenSpace(this Camera camera, Vector3 camPos) + { + Vector3 viewPos = camera.CameraToViewportSpace(camPos); + Vector3 screenPos = new Vector3( + viewPos.x * camera.pixelWidth, + viewPos.y * camera.pixelHeight, + viewPos.z + ); + return screenPos; + } + +} + +public class CameraUtility : MonoBehaviour +{ + // Start is called before the first frame update + void Start() + { + + } + + // Update is called once per frame + void Update() + { + + } +} diff --git a/Assets/Scripts/Camera/CameraUtility.cs.meta b/Assets/Scripts/Camera/CameraUtility.cs.meta new file mode 100644 index 00000000..bd11b826 --- /dev/null +++ b/Assets/Scripts/Camera/CameraUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6797331b02de5684ab22aeafac41d2c5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Rendering/RenderingUtility.cs b/Assets/Scripts/Rendering/RenderingUtility.cs index 297a9b79..90ef84fd 100644 --- a/Assets/Scripts/Rendering/RenderingUtility.cs +++ b/Assets/Scripts/Rendering/RenderingUtility.cs @@ -63,4 +63,31 @@ public static class RenderingUtility { return renderingEventToCameraEventDic[e]; } + + /// + /// 计算在rt里面的区域 + /// + /// 相机 + /// 世界空间坐标 + /// 异体矩形(billboard)的相机空间大小 + /// + public static Vector4 GetTillingOffset(Camera camera, Vector3 worldPos, float size) + { + Vector4 tileOffset = new Vector4(1,1,0,0); + Vector3 camPos = camera.WorldToCameraSpace(worldPos); + + Vector3 bottomLeft = new Vector3(camPos.x - size / 2, camPos.y - size / 2, camPos.z); + Vector3 topRight = new Vector3(camPos.x + size / 2, camPos.y + size / 2, camPos.z); + Vector2 blViewPos = camera.CameraToViewportSpace(bottomLeft); + Vector2 trViewPos = camera.CameraToViewportSpace(topRight); + float width = trViewPos.x - blViewPos.x; + float height = trViewPos.y - blViewPos.y; + + tileOffset.x = width; + tileOffset.y = height; + tileOffset.z = blViewPos.x; + tileOffset.w = blViewPos.y; + return tileOffset; + } + } diff --git a/Assets/Scripts/Unit/Components/UnitLensEffect.cs b/Assets/Scripts/Unit/Components/UnitLensEffect.cs index a61955f7..394a0b92 100644 --- a/Assets/Scripts/Unit/Components/UnitLensEffect.cs +++ b/Assets/Scripts/Unit/Components/UnitLensEffect.cs @@ -57,7 +57,8 @@ public class UnitLensEffect : UnitComponent MainCamera.Instance.customRenderingPipeline.onPostRender += OnRenderUnit; ///// - m_Effects.Add(new LensEffect_MotionBlur()); + //m_Effects.Add(new LensEffect_MotionBlur()); + m_Effects.Add(new LensEffect_BlurRim()); } public override void Release() @@ -90,6 +91,7 @@ public class UnitLensEffect : UnitComponent MethodInfo method = eff.GetType().GetMethod(re.ToString(), BindingFlags.Instance | BindingFlags.Public, null, new Type[] { typeof(LensEffectBase.EStage), typeof(CommandBuffer) }, null); if (method == null) continue; + eff.owner = owner; method.Invoke(eff, new object[] { LensEffectBase.EStage.Before, cb.Value }); for (int j = 0; j < body.renderers.Length; ++j) { diff --git a/Assets/Scripts/Unit/Controller/UnitController.cs b/Assets/Scripts/Unit/Controller/UnitController.cs index 6ccf124b..3b4ab12d 100644 --- a/Assets/Scripts/Unit/Controller/UnitController.cs +++ b/Assets/Scripts/Unit/Controller/UnitController.cs @@ -106,6 +106,38 @@ public class UnitController : MonoBehaviour/*, Interactable*/ } } + public virtual Vector3 position + { + get + { + return transform.position; + } + set + { + transform.position = value; + } + } + + public virtual Quaternion rotation + { + get + { + return transform.rotation; + } + set + { + transform.rotation = value; + } + } + + public virtual Vector3 lossyScale + { + get + { + return transform.lossyScale; + } + } + public virtual void Initialize( GameObject obj , string folder) { unitObj = obj; diff --git a/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs b/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs index 8457a959..36bde0e3 100644 --- a/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs +++ b/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs @@ -9,6 +9,7 @@ public class MaterialEntry public Material material; } +// unit 镜头效果,和image effect的区别在于不光是后处理 public abstract class LensEffectBase : MonoBehaviour { public enum EStage @@ -27,6 +28,7 @@ public abstract class LensEffectBase : MonoBehaviour #region upvalues public BodyPartRenderer curBodypartRenderer; + public UnitController owner; #endregion private static MaterialEntry _ClaimMaterial(string shader) diff --git a/Assets/Scripts/Unit/LensEffect/LensEffect_BlurRim.cs b/Assets/Scripts/Unit/LensEffect/LensEffect_BlurRim.cs new file mode 100644 index 00000000..4f90a777 --- /dev/null +++ b/Assets/Scripts/Unit/LensEffect/LensEffect_BlurRim.cs @@ -0,0 +1,76 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering; + +public class LensEffect_BlurRim : LensEffectBase +{ + public override ERenderingEvent renderingEvents => ERenderingEvent.AfterForwardOpaque; + + int tempID; + + public override void AfterForwardOpaque(EStage stage, CommandBuffer cb) + { + 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 (curBodypartRenderer.renderer is SkinnedMeshRenderer) + { + SkinnedMeshRenderer smr = curBodypartRenderer.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 (curBodypartRenderer.renderer is MeshRenderer) + { + obj2Wod = curBodypartRenderer.renderer.transform.localToWorldMatrix; + subMeshCount = curBodypartRenderer.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(curBodypartRenderer.renderer, mat.material, i); + + mat = ClaimMaterial(StaticDefine.shaders[EShader.SolidColor].name); + mat.material.SetColor("_Color", Color.red); + obj2Wod = Matrix4x4.Translate(new Vector3(1,0,0)) * obj2Wod; + mat.material.SetMatrix("_ObjectToWorld", obj2Wod); + cb.DrawRenderer(curBodypartRenderer.renderer, mat.material, i); + + mat = ClaimMaterial(StaticDefine.shaders[EShader.SolidColor].name); + mat.material.SetColor("_Color", Color.red); + obj2Wod = Matrix4x4.Translate(new Vector3(-2, 0, 0)) * obj2Wod; + mat.material.SetMatrix("_ObjectToWorld", obj2Wod); + cb.DrawRenderer(curBodypartRenderer.renderer, mat.material, i); + } + } + else if (stage == EStage.After) + { + MaterialEntry blur = ClaimMaterial(StaticDefine.shaders[EShader.Blur].name); + + Vector4 tileOffset = RenderingUtility.GetTillingOffset(MainCamera.Instance.camera, owner.center, owner.unitDetail.snapshotBound); + blur.material.SetVector("_TileOffset", tileOffset); + + cb.Blit(tempID, BuiltinRenderTextureType.CameraTarget, blur.material); + tempID = Shader.PropertyToID("_Temp1"); + cb.ReleaseTemporaryRT(tempID); + } + else if (stage == EStage.Finished) + { + } + } + +} \ No newline at end of file diff --git a/Assets/Scripts/Unit/LensEffect/LensEffect_BlurRim.cs.meta b/Assets/Scripts/Unit/LensEffect/LensEffect_BlurRim.cs.meta new file mode 100644 index 00000000..3a2e02ef --- /dev/null +++ b/Assets/Scripts/Unit/LensEffect/LensEffect_BlurRim.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f49dbf9002764be4aa6ca79b78052d7a +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 index decee999..3e5ee4f1 100644 --- a/Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs +++ b/Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs @@ -53,6 +53,10 @@ public class LensEffect_MotionBlur : LensEffectBase else if(stage == EStage.After) { MaterialEntry blur = ClaimMaterial(StaticDefine.shaders[EShader.Blur].name); + + Vector4 tileOffset = RenderingUtility.GetTillingOffset(MainCamera.Instance.camera, owner.center, owner.unitDetail.snapshotBound); + blur.material.SetVector("_TileOffset", tileOffset); + cb.Blit(tempID, BuiltinRenderTextureType.CameraTarget, blur.material); tempID = Shader.PropertyToID("_Temp1"); cb.ReleaseTemporaryRT(tempID); diff --git a/Assets/Scripts/Utils/VectorUtility.cs b/Assets/Scripts/Utils/VectorUtility.cs new file mode 100644 index 00000000..b0e857e7 --- /dev/null +++ b/Assets/Scripts/Utils/VectorUtility.cs @@ -0,0 +1,32 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public static class VectorExtend +{ + + public static Vector4 ToVector4(ref this Vector3 v3, float w = 1) + { + Vector4 v4 = new Vector4(v3.x, v3.y, v3.z, 1); + return v4; + } + + public static Vector3 ToVector3(ref this Vector4 v4) + { + Vector3 v3 = new Vector3(v4.x, v4.y, v4.z); + return v3; + } + + public static Vector2 ToVector2(ref this Vector3 v3) + { + Vector2 v2 = new Vector2(v3.x, v3.y); + return v2; + } + +} + +public class VectorUtility +{ + + +} \ No newline at end of file diff --git a/Assets/Scripts/Utils/VectorUtility.cs.meta b/Assets/Scripts/Utils/VectorUtility.cs.meta new file mode 100644 index 00000000..32a9937b --- /dev/null +++ b/Assets/Scripts/Utils/VectorUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2ee12b1cbc903254a8f8328d26b267c7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: -- cgit v1.1-26-g67d0