summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-09-21 19:51:10 +0800
committerchai <chaifix@163.com>2021-09-21 19:51:10 +0800
commitdf1e3842c7571cf6db8f8238b893bde049abf651 (patch)
tree3207c672d3257fa90d3352b59ae62fc0a940ecd4
parentb5645c779a3e3c4ca758400cd9a718a7bc0c2bc6 (diff)
*custom rendering pipeline
-rw-r--r--Assets/Bundle/Shaders/Common/common_solid_color.shader1
-rw-r--r--Assets/Scripts/Rendering.meta8
-rw-r--r--Assets/Scripts/Rendering/CustomLighting.cs9
-rw-r--r--Assets/Scripts/Rendering/CustomLighting.cs.meta11
-rw-r--r--Assets/Scripts/Rendering/CustomRenderingPipeline.cs46
-rw-r--r--Assets/Scripts/Rendering/CustomRenderingPipeline.cs.meta (renamed from Assets/Scripts/Camera/CustomRenderingPipeline.cs.meta)0
-rw-r--r--Assets/Scripts/Rendering/RenderingUtility.cs (renamed from Assets/Scripts/Camera/CustomRenderingPipeline.cs)81
-rw-r--r--Assets/Scripts/Rendering/RenderingUtility.cs.meta11
-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
11 files changed, 180 insertions, 91 deletions
diff --git a/Assets/Bundle/Shaders/Common/common_solid_color.shader b/Assets/Bundle/Shaders/Common/common_solid_color.shader
index 031d4b69..798924d3 100644
--- a/Assets/Bundle/Shaders/Common/common_solid_color.shader
+++ b/Assets/Bundle/Shaders/Common/common_solid_color.shader
@@ -11,6 +11,7 @@
LOD 100
ZTest LEqual
+ ZWrite Off
Pass
{
diff --git a/Assets/Scripts/Rendering.meta b/Assets/Scripts/Rendering.meta
new file mode 100644
index 00000000..b2cccc29
--- /dev/null
+++ b/Assets/Scripts/Rendering.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b102672570dd0d946bb29c221b22f3f3
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Rendering/CustomLighting.cs b/Assets/Scripts/Rendering/CustomLighting.cs
new file mode 100644
index 00000000..57597e21
--- /dev/null
+++ b/Assets/Scripts/Rendering/CustomLighting.cs
@@ -0,0 +1,9 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class CustomLightingSystem : Singleton<CustomLightingSystem>
+{
+
+
+}
diff --git a/Assets/Scripts/Rendering/CustomLighting.cs.meta b/Assets/Scripts/Rendering/CustomLighting.cs.meta
new file mode 100644
index 00000000..c1f70391
--- /dev/null
+++ b/Assets/Scripts/Rendering/CustomLighting.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 483db9507b5e5924a86daaffdf7e33cc
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Rendering/CustomRenderingPipeline.cs b/Assets/Scripts/Rendering/CustomRenderingPipeline.cs
new file mode 100644
index 00000000..af70e760
--- /dev/null
+++ b/Assets/Scripts/Rendering/CustomRenderingPipeline.cs
@@ -0,0 +1,46 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.Rendering;
+
+[RequireComponent(typeof(MainCamera))]
+public class CustomRenderingPipeline : MonoBehaviour
+{
+
+ public delegate void RenderEventHandler();
+ public event RenderEventHandler onPreCull;
+ public event RenderEventHandler onPreRender;
+ public event RenderEventHandler onPostRender;
+
+ #region 公共贴图
+
+ #endregion
+
+ Camera m_Camera;
+
+ 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();
+ }
+
+} \ No newline at end of file
diff --git a/Assets/Scripts/Camera/CustomRenderingPipeline.cs.meta b/Assets/Scripts/Rendering/CustomRenderingPipeline.cs.meta
index 1a3cac2c..1a3cac2c 100644
--- a/Assets/Scripts/Camera/CustomRenderingPipeline.cs.meta
+++ b/Assets/Scripts/Rendering/CustomRenderingPipeline.cs.meta
diff --git a/Assets/Scripts/Camera/CustomRenderingPipeline.cs b/Assets/Scripts/Rendering/RenderingUtility.cs
index c11cc785..297a9b79 100644
--- a/Assets/Scripts/Camera/CustomRenderingPipeline.cs
+++ b/Assets/Scripts/Rendering/RenderingUtility.cs
@@ -1,10 +1,12 @@
using System;
-using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
using UnityEngine.Rendering;
+// https://docs.unity3d.com/Manual/GraphicsCommandBuffers.html
// https://docs.unity3d.com/ScriptReference/Rendering.CameraEvent.html
+
// 前向渲染的camera events
// * DepthTexture
// * DepthNormalTexture
@@ -19,28 +21,27 @@ using UnityEngine.Rendering;
public enum ERenderingEvent
{
None = 0,
- BeforeDepthTexture = 1,
+ BeforeDepthTexture = 1,
BeforeDepthNormalsTexture = 1 << 1,
- BeforeForwardOpaque = 1 << 2,
+ BeforeForwardOpaque = 1 << 2,
BeforeImageEffectsOpaque = 1 << 3,
- BeforeSkybox = 1 << 4,
- BeforeForwardAlpha = 1 << 5,
- BeforeImageEffects = 1 << 6,
+ BeforeSkybox = 1 << 4,
+ BeforeForwardAlpha = 1 << 5,
+ BeforeImageEffects = 1 << 6,
//BeforeEverything = 1 << 7,
- AfterDepthTexture = 1 << 8,
+ AfterDepthTexture = 1 << 8,
AfterDepthNormalsTexture = 1 << 9,
- AfterForwardOpaque = 1 << 10,
- AfterImageEffectsOpaque = 1 << 11,
- AfterSkybox = 1 << 12,
- AfterForwardAlpha = 1 << 13,
- AfterImageEffects = 1 << 14,
- AfterEverything = 1 << 15,
+ 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 class RenderingUtility
{
- public static Dictionary<ERenderingEvent, CameraEvent> RenderingEventToCameraEvent = new Dictionary<ERenderingEvent, CameraEvent> {
+ public static Dictionary<ERenderingEvent, CameraEvent> renderingEventToCameraEventDic = new Dictionary<ERenderingEvent, CameraEvent> {
{ERenderingEvent.BeforeDepthTexture, CameraEvent.BeforeDepthTexture },
{ERenderingEvent.BeforeDepthNormalsTexture, CameraEvent.BeforeDepthNormalsTexture },
{ERenderingEvent.BeforeForwardOpaque, CameraEvent.BeforeForwardOpaque },
@@ -57,43 +58,9 @@ public class CustomRenderingPipeline : MonoBehaviour
{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()
+ public static CameraEvent ToCameraEvent(this ERenderingEvent e)
{
- onPreCull?.Invoke();
- }
-
- private void OnPreRender()
- {
- onPreRender?.Invoke();
- }
-
- private void OnPostRender()
- {
- onPostRender?.Invoke();
- }
-
- #region 贴图
-
- #endregion
-
-
-
-} \ No newline at end of file
+ return renderingEventToCameraEventDic[e];
+ }
+}
diff --git a/Assets/Scripts/Rendering/RenderingUtility.cs.meta b/Assets/Scripts/Rendering/RenderingUtility.cs.meta
new file mode 100644
index 00000000..83570ebb
--- /dev/null
+++ b/Assets/Scripts/Rendering/RenderingUtility.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: bc9ab0eb4b2a0754e9bb9ec7a2f945c4
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
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();
}
}