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