using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; // https://docs.unity3d.com/ScriptReference/Rendering.CameraEvent.html // 前向渲染的camera events // * DepthTexture // * DepthNormalTexture // * ForwardOpaque // * ImageEffectsOpaque // * Skybox // * ForwardAlpha // * ImageEffects // * Everything [Flags] public enum ERenderingEvent { None = 0, BeforeDepthTexture = 1, BeforeDepthNormalsTexture = 1 << 1, BeforeForwardOpaque = 1 << 2, BeforeImageEffectsOpaque = 1 << 3, BeforeSkybox = 1 << 4, BeforeForwardAlpha = 1 << 5, BeforeImageEffects = 1 << 6, //BeforeEverything = 1 << 7, AfterDepthTexture = 1 << 8, AfterDepthNormalsTexture = 1 << 9, 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 Dictionary RenderingEventToCameraEvent = new Dictionary { {ERenderingEvent.BeforeDepthTexture, CameraEvent.BeforeDepthTexture }, {ERenderingEvent.BeforeDepthNormalsTexture, CameraEvent.BeforeDepthNormalsTexture }, {ERenderingEvent.BeforeForwardOpaque, CameraEvent.BeforeForwardOpaque }, {ERenderingEvent.BeforeImageEffectsOpaque, CameraEvent.BeforeImageEffectsOpaque }, {ERenderingEvent.BeforeSkybox, CameraEvent.BeforeSkybox }, {ERenderingEvent.BeforeForwardAlpha, CameraEvent.BeforeForwardAlpha }, {ERenderingEvent.BeforeImageEffects, CameraEvent.BeforeImageEffects }, {ERenderingEvent.AfterDepthTexture, CameraEvent.AfterDepthTexture }, {ERenderingEvent.AfterDepthNormalsTexture, CameraEvent.AfterDepthNormalsTexture }, {ERenderingEvent.AfterForwardOpaque, CameraEvent.AfterForwardOpaque }, {ERenderingEvent.AfterImageEffectsOpaque, CameraEvent.AfterImageEffectsOpaque }, {ERenderingEvent.AfterSkybox, CameraEvent.AfterSkybox }, {ERenderingEvent.AfterForwardAlpha, CameraEvent.AfterForwardAlpha }, {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(); } private void Start() { } private void OnPreCull() { onPreCull?.Invoke(); } private void OnPreRender() { onPreRender?.Invoke(); } private void OnPostRender() { onPostRender?.Invoke(); } #region 贴图 #endregion }