diff options
author | chai <chaifix@163.com> | 2021-09-21 19:51:10 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-09-21 19:51:10 +0800 |
commit | df1e3842c7571cf6db8f8238b893bde049abf651 (patch) | |
tree | 3207c672d3257fa90d3352b59ae62fc0a940ecd4 /Assets/Scripts | |
parent | b5645c779a3e3c4ca758400cd9a718a7bc0c2bc6 (diff) |
*custom rendering pipeline
Diffstat (limited to 'Assets/Scripts')
-rw-r--r-- | Assets/Scripts/Rendering.meta | 8 | ||||
-rw-r--r-- | Assets/Scripts/Rendering/CustomLighting.cs | 9 | ||||
-rw-r--r-- | Assets/Scripts/Rendering/CustomLighting.cs.meta | 11 | ||||
-rw-r--r-- | Assets/Scripts/Rendering/CustomRenderingPipeline.cs | 46 | ||||
-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.meta | 11 | ||||
-rw-r--r-- | Assets/Scripts/Unit/Components/UnitLensEffect.cs | 43 | ||||
-rw-r--r-- | Assets/Scripts/Unit/LensEffect/LensEffectBase.cs | 42 | ||||
-rw-r--r-- | Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs | 19 |
10 files changed, 179 insertions, 91 deletions
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();
}
}
|