using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; // 相机的自定义管线 // 混合延迟渲染和前向渲染 [RequireComponent(typeof(MainCamera))] public class CustomRenderingPipeline : MonoBehaviour { [Tooltip("开启自定义延迟渲染")] public bool enableDeferredRender; public delegate void RenderEventHandler(); // UnitPreprocessing, UnitLensEffect, etc public event RenderEventHandler onPreCull; public event RenderEventHandler onPreRender; public event RenderEventHandler onPostRender; Camera m_Camera; // command buffers CommandBuffer m_CommandBufferAfterDepth; RenderTargetIdentifier[] m_GBuffer = new RenderTargetIdentifier[2]; RenderTargetIdentifier m_DepthBuffer; RenderTexture m_GBufferTextureNormal; RenderTexture m_GBufferTexturePosition; void OnEnable() { m_Camera = GetComponent(); // command buffers m_CommandBufferAfterDepth = new CommandBuffer(); m_CommandBufferAfterDepth.name = "Custom RenderPipeline GBuffer"; m_Camera.AddCommandBuffer(CameraEvent.AfterDepthTexture, m_CommandBufferAfterDepth); // render targets int width = m_Camera.pixelWidth, height = m_Camera.pixelHeight; m_GBufferTextureNormal = RenderTexture.GetTemporary(width, height, 24, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear); m_GBufferTexturePosition = RenderTexture.GetTemporary(width, height, 24, RenderTextureFormat.ARGBHalf, RenderTextureReadWrite.Linear); m_GBuffer[0] = m_GBufferTextureNormal.colorBuffer; m_GBuffer[1] = m_GBufferTexturePosition.colorBuffer; m_DepthBuffer = m_GBufferTextureNormal.depthBuffer; } void OnDisable() { m_Camera.RemoveAllCommandBuffers(); } void OnPreCull() { m_CommandBufferAfterDepth.Clear(); RenderGBuffer(); onPreCull?.Invoke(); } void OnPreRender() { onPreRender?.Invoke(); } void OnPostRender() { onPostRender?.Invoke(); } void RenderGBuffer() { CommandBuffer cb = m_CommandBufferAfterDepth; cb.SetRenderTarget(m_GBuffer, m_DepthBuffer); cb.ClearRenderTarget(true, true, new Color(0, 0, 0, 0)); List renderers = CustomRendererRegistry.Instance.renderers; Material mat = new Material(Shader.Find(StaticDefine.shaders[EShader.GBuffer].name)); for(int i = 0; i < renderers.Count; ++i) { CustomRenderer renderer = renderers[i]; if (renderer == null) continue; cb.DrawRenderer(renderer.renderer, mat); } } }