From b5645c779a3e3c4ca758400cd9a718a7bc0c2bc6 Mon Sep 17 00:00:00 2001 From: chai Date: Mon, 20 Sep 2021 22:44:08 +0800 Subject: *command buffer --- .../Unit/LensEffect/LensEffect_MotionBlur.cs | 64 ++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs (limited to 'Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs') 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 -- cgit v1.1-26-g67d0