summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Unit
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/Scripts/Unit')
-rw-r--r--Assets/Scripts/Unit/Components/UnitLensEffect.cs43
-rw-r--r--Assets/Scripts/Unit/LensEffect/LensEffectBase.cs42
-rw-r--r--Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs19
3 files changed, 70 insertions, 34 deletions
diff --git a/Assets/Scripts/Unit/Components/UnitLensEffect.cs b/Assets/Scripts/Unit/Components/UnitLensEffect.cs
index 18328fc8..fee02a7c 100644
--- a/Assets/Scripts/Unit/Components/UnitLensEffect.cs
+++ b/Assets/Scripts/Unit/Components/UnitLensEffect.cs
@@ -5,8 +5,6 @@ using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
-//https://docs.unity3d.com/ScriptReference/Rendering.RenderTargetIdentifier.html
-
// Unit效果之一,镜头效果,通过command buffer实现
public class UnitLensEffect : UnitComponent
@@ -17,6 +15,7 @@ public class UnitLensEffect : UnitComponent
private List<LensEffectBase> m_Effects;
+ // 每个角色维护单独的command buffers,而不是共享command buffer
private Dictionary<ERenderingEvent, CommandBuffer> m_InUseCommandBuffers;
private Dictionary<ERenderingEvent, CommandBuffer> m_CachedCommandBuffers;
@@ -82,24 +81,25 @@ public class UnitLensEffect : UnitComponent
{
cb.Value.Clear();
ERenderingEvent re = cb.Key;
- CameraEvent ce = CustomRenderingPipeline.RenderingEventToCameraEvent[re];
+ CameraEvent ce = re.ToCameraEvent();
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);
+ MethodInfo method = eff.GetType().GetMethod(re.ToString(), BindingFlags.Instance | BindingFlags.Public, null, new Type[] { typeof(LensEffectBase.EStage), typeof(CommandBuffer) }, null);
if (method == null)
continue;
- method.Invoke(eff, new object[] { LensEffectBase.EStage.Before, cb.Value, null });
+ method.Invoke(eff, new object[] { LensEffectBase.EStage.Before, cb.Value });
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 });
+ eff.curBodypartRenderer = renderer;
+ method.Invoke(eff, new object[] { LensEffectBase.EStage.Iterate, cb.Value });
}
- method.Invoke(eff, new object[] { LensEffectBase.EStage.After, cb.Value, null });
+ method.Invoke(eff, new object[] { LensEffectBase.EStage.After, cb.Value });
}
MainCamera.Instance.camera.AddCommandBuffer(ce, cb.Value);
}
@@ -107,9 +107,34 @@ public class UnitLensEffect : UnitComponent
private void OnRenderUnit()
{
- foreach(var cb in m_InUseCommandBuffers)
+ // 执行每个event的finish
+ foreach (var cb in m_InUseCommandBuffers)
+ {
+ ERenderingEvent re = cb.Key;
+ 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) }, null);
+ if (method == null)
+ continue;
+ method.Invoke(eff, new object[] { LensEffectBase.EStage.Finished, cb.Value });
+ }
+ }
+
+ for (int i = 0; i < m_Effects.Count; ++i)
+ {
+ LensEffectBase eff = m_Effects[i];
+ MethodInfo method = eff.GetType().GetMethod("OnRenderFinish", BindingFlags.Instance | BindingFlags.Public);
+ if (method == null)
+ continue;
+ method.Invoke(eff, new object[] { });
+ }
+
+ foreach (var cb in m_InUseCommandBuffers)
{
- CameraEvent ce = CustomRenderingPipeline.RenderingEventToCameraEvent[cb.Key];
+ CameraEvent ce = cb.Key.ToCameraEvent();
MainCamera.Instance.camera.RemoveCommandBuffer(ce, cb.Value);
}
var temp = m_CachedCommandBuffers;
diff --git a/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs b/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs
index 08e20217..8457a959 100644
--- a/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs
+++ b/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs
@@ -25,6 +25,10 @@ public abstract class LensEffectBase : MonoBehaviour
private List<MaterialEntry> m_InUseMaterials = new List<MaterialEntry>();
+ #region upvalues
+ public BodyPartRenderer curBodypartRenderer;
+ #endregion
+
private static MaterialEntry _ClaimMaterial(string shader)
{
List<MaterialEntry> mats;
@@ -74,28 +78,34 @@ public abstract class LensEffectBase : MonoBehaviour
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 BeforeDepthTexture(EStage stage, CommandBuffer cb) { }
+ public virtual void AfterDepthTexture(EStage stage, CommandBuffer cb) { }
+
+ public virtual void BeforeDepthNormalsTexture(EStage stage, CommandBuffer cb) { }
+ public virtual void AfterDepthNormalsTexture(EStage stage, CommandBuffer cb) { }
- 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) { }
+ public virtual void AfterForwardOpaque(EStage stage, CommandBuffer cb) { }
- 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) { }
+ public virtual void AfterImageEffectsOpaque(EStage stage, CommandBuffer cb) { }
- 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) { }
+ public virtual void AfterSkybox(EStage stage, CommandBuffer cb) { }
- 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) { }
+ public virtual void AfterForwardAlpha(EStage stage, CommandBuffer cb) { }
- 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) { }
+ public virtual void AfterImageEffects(EStage stage, CommandBuffer cb) { }
- 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) { }
+ public virtual void AfterEverything(EStage stage, CommandBuffer cb) { }
- public virtual void BeforeEverything(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
- public virtual void AfterEverything(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+ // 角色渲染完毕
+ public virtual void OnRenderFinish()
+ {
+ ReleaseAllInUsedMaterials();
+ }
} \ No newline at end of file
diff --git a/Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs b/Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs
index 9ec7d056..086c92eb 100644
--- a/Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs
+++ b/Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs
@@ -13,7 +13,7 @@ public class LensEffect_MotionBlur : LensEffectBase
public override ERenderingEvent renderingEvents => ERenderingEvent.AfterImageEffectsOpaque;
- public override void AfterImageEffectsOpaque(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null)
+ public override void AfterImageEffectsOpaque(EStage stage, CommandBuffer cb)
{
if(stage == EStage.Before)
{
@@ -27,18 +27,18 @@ public class LensEffect_MotionBlur : LensEffectBase
{
Matrix4x4 obj2Wod = Matrix4x4.identity;
int subMeshCount = 0;
- if (renderer.renderer is SkinnedMeshRenderer)
+ if (curBodypartRenderer.renderer is SkinnedMeshRenderer)
{
- SkinnedMeshRenderer smr = renderer.renderer as 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 (renderer.renderer is MeshRenderer)
+ else if (curBodypartRenderer.renderer is MeshRenderer)
{
- obj2Wod = renderer.renderer.transform.localToWorldMatrix;
- subMeshCount = renderer.renderer.GetComponent<MeshFilter>().sharedMesh.subMeshCount;
+ obj2Wod = curBodypartRenderer.renderer.transform.localToWorldMatrix;
+ subMeshCount = curBodypartRenderer.renderer.GetComponent<MeshFilter>().sharedMesh.subMeshCount;
}
for (int i = 0; i < subMeshCount; ++i)
@@ -47,17 +47,18 @@ public class LensEffect_MotionBlur : LensEffectBase
mat.material.SetColor("_Color", Color.red);
mat.material.SetMatrix("_ObjectToWorld", obj2Wod);
- cb.DrawRenderer(renderer.renderer, mat.material, i);
+ cb.DrawRenderer(curBodypartRenderer.renderer, mat.material, i);
}
}
else if(stage == EStage.After)
{
MaterialEntry blur = ClaimMaterial(StaticDefine.shaders[EShader.Blur].name);
- cb.Blit(tempID, BuiltinRenderTextureType.CameraTarget, blur.material);
+ cb.Blit(tempID, BuiltinRenderTextureType.CameraTarget, blur.material);
+ tempID = Shader.PropertyToID("_Temp1");
+ cb.ReleaseTemporaryRT(tempID);
}
else if(stage == EStage.Finished)
{
- ReleaseAllInUsedMaterials();
}
}