summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Rendering/CustomRenderingPipeline.cs
blob: befeed8738754308e77c586b320f8304a48e984b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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<Camera>();

        // 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<CustomRenderer> 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);
        }
    }

}