-
Notifications
You must be signed in to change notification settings - Fork 866
Expand file tree
/
Copy pathDecalGBufferRenderPass.cs
More file actions
220 lines (185 loc) · 10.2 KB
/
DecalGBufferRenderPass.cs
File metadata and controls
220 lines (185 loc) · 10.2 KB
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
using System;
using System.Collections.Generic;
using UnityEngine.Experimental.Rendering;
using UnityEngine.Rendering.RenderGraphModule;
using UnityEngine.Rendering.Universal.Internal;
namespace UnityEngine.Rendering.Universal
{
internal class DecalDrawGBufferSystem : DecalDrawSystem
{
public DecalDrawGBufferSystem(DecalEntityManager entityManager) : base("DecalDrawGBufferSystem.Execute", entityManager) { }
protected override int GetPassIndex(DecalCachedChunk decalCachedChunk) => decalCachedChunk.passIndexGBuffer;
}
internal class DecalGBufferRenderPass : ScriptableRenderPass
{
private FilteringSettings m_FilteringSettings;
private List<ShaderTagId> m_ShaderTagIdList;
private DecalDrawGBufferSystem m_DrawSystem;
private DecalScreenSpaceSettings m_Settings;
private DeferredLights m_DeferredLights;
private RTHandle[] m_GbufferAttachments;
private bool m_DecalLayers;
private PassData m_PassData;
public DecalGBufferRenderPass(DecalScreenSpaceSettings settings, DecalDrawGBufferSystem drawSystem, bool decalLayers)
{
renderPassEvent = RenderPassEvent.AfterRenderingGbuffer;
m_DrawSystem = drawSystem;
m_Settings = settings;
profilingSampler = new ProfilingSampler("Draw Decal To GBuffer");
m_FilteringSettings = new FilteringSettings(RenderQueueRange.opaque, -1);
m_DecalLayers = decalLayers;
m_ShaderTagIdList = new List<ShaderTagId>();
if (drawSystem == null)
m_ShaderTagIdList.Add(new ShaderTagId(DecalShaderPassNames.DecalGBufferProjector));
else
m_ShaderTagIdList.Add(new ShaderTagId(DecalShaderPassNames.DecalGBufferMesh));
m_PassData = new PassData();
m_GbufferAttachments = new RTHandle[UniversalRenderer.k_GbufferCountMandatory];
breakGBufferAndDeferredRenderPass = false;
}
internal void Setup(DeferredLights deferredLights)
{
m_DeferredLights = deferredLights;
}
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
{
if (m_DeferredLights.UseFramebufferFetch)
{
m_GbufferAttachments[0] = m_DeferredLights.GbufferAttachments[0];
m_GbufferAttachments[1] = m_DeferredLights.GbufferAttachments[1];
m_GbufferAttachments[2] = m_DeferredLights.GbufferAttachments[2];
m_GbufferAttachments[3] = m_DeferredLights.GbufferAttachments[3];
if (m_DecalLayers)
{
var deferredInputAttachments = new RTHandle[]
{
m_DeferredLights.GbufferAttachments[m_DeferredLights.GbufferDepthIndex],
m_DeferredLights.GbufferAttachments[m_DeferredLights.GBufferRenderingLayers],
};
var deferredInputIsTransient = new bool[]
{
true, false, // TODO: Make rendering layers transient
};
// Disable obsolete warning for internal usage
#pragma warning disable CS0618
ConfigureInputAttachments(deferredInputAttachments, deferredInputIsTransient);
#pragma warning restore CS0618
}
else
{
var deferredInputAttachments = new RTHandle[]
{
m_DeferredLights.GbufferAttachments[m_DeferredLights.GbufferDepthIndex],
};
var deferredInputIsTransient = new bool[]
{
true,
};
// Disable obsolete warning for internal usage
#pragma warning disable CS0618
ConfigureInputAttachments(deferredInputAttachments, deferredInputIsTransient);
#pragma warning restore CS0618
}
}
else
{
m_GbufferAttachments[0] = m_DeferredLights.GbufferAttachments[0];
m_GbufferAttachments[1] = m_DeferredLights.GbufferAttachments[1];
m_GbufferAttachments[2] = m_DeferredLights.GbufferAttachments[2];
m_GbufferAttachments[3] = m_DeferredLights.GbufferAttachments[3];
}
// Disable obsolete warning for internal usage
#pragma warning disable CS0618
ConfigureTarget(m_GbufferAttachments, m_DeferredLights.DepthAttachmentHandle);
#pragma warning restore CS0618
}
[Obsolete(DeprecationMessage.CompatibilityScriptingAPIObsolete, false)]
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
UniversalCameraData cameraData = renderingData.frameData.Get<UniversalCameraData>();
InitPassData(cameraData, ref m_PassData);
SortingCriteria sortingCriteria = renderingData.cameraData.defaultOpaqueSortFlags;
DrawingSettings drawingSettings = RenderingUtils.CreateDrawingSettings(m_ShaderTagIdList, ref renderingData, sortingCriteria);
var param = new RendererListParams(renderingData.cullResults, drawingSettings, m_FilteringSettings);
var rendererList = context.CreateRendererList(ref param);
using (new ProfilingScope(renderingData.commandBuffer, profilingSampler))
{
ExecutePass(CommandBufferHelpers.GetRasterCommandBuffer(renderingData.commandBuffer), m_PassData, rendererList);
}
}
private class PassData
{
internal DecalDrawGBufferSystem drawSystem;
internal DecalScreenSpaceSettings settings;
internal bool decalLayers;
internal UniversalCameraData cameraData;
internal RendererListHandle rendererList;
}
private void InitPassData(UniversalCameraData cameraData, ref PassData passData)
{
passData.drawSystem = m_DrawSystem;
passData.settings = m_Settings;
passData.decalLayers = m_DecalLayers;
passData.cameraData = cameraData;
}
private static void ExecutePass(RasterCommandBuffer cmd, PassData passData, RendererList rendererList)
{
NormalReconstruction.SetupProperties(cmd, passData.cameraData);
cmd.SetKeyword(ShaderGlobalKeywords.DecalNormalBlendLow, passData.settings.normalBlend == DecalNormalBlend.Low);
cmd.SetKeyword(ShaderGlobalKeywords.DecalNormalBlendMedium, passData.settings.normalBlend == DecalNormalBlend.Medium);
cmd.SetKeyword(ShaderGlobalKeywords.DecalNormalBlendHigh, passData.settings.normalBlend == DecalNormalBlend.High);
cmd.SetKeyword(ShaderGlobalKeywords.DecalLayers, passData.decalLayers);
passData.drawSystem?.Execute(cmd);
cmd.DrawRendererList(rendererList);
}
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
{
UniversalResourceData resourceData = frameData.Get<UniversalResourceData>();
TextureHandle cameraDepthTexture = resourceData.cameraDepthTexture;
using (var builder = renderGraph.AddRasterRenderPass<PassData>(passName, out var passData, profilingSampler))
{
UniversalRenderingData renderingData = frameData.Get<UniversalRenderingData>();
UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
UniversalLightData lightData = frameData.Get<UniversalLightData>();
InitPassData(cameraData, ref passData);
TextureHandle[] gBufferHandles = resourceData.gBuffer;
builder.SetRenderAttachment(gBufferHandles[0], 0, AccessFlags.Write);
builder.SetRenderAttachment(gBufferHandles[1], 1, AccessFlags.Write);
builder.SetRenderAttachment(gBufferHandles[2], 2, AccessFlags.Write);
builder.SetRenderAttachment(gBufferHandles[3], 3, AccessFlags.Write);
builder.SetRenderAttachmentDepth(resourceData.activeDepthTexture, AccessFlags.Read);
if (renderGraph.nativeRenderPassesEnabled)
{
builder.SetInputAttachment(gBufferHandles[UniversalRenderer.k_GbufferCountMandatory], 0, AccessFlags.Read);
if (m_DecalLayers)
builder.SetInputAttachment(gBufferHandles[UniversalRenderer.k_GbufferCountMandatory + 1], 1, AccessFlags.Read);
}
else if (cameraDepthTexture.IsValid())
builder.UseTexture(cameraDepthTexture, AccessFlags.Read);
SortingCriteria sortingCriteria = passData.cameraData.defaultOpaqueSortFlags;
DrawingSettings drawingSettings = RenderingUtils.CreateDrawingSettings(m_ShaderTagIdList, renderingData,
passData.cameraData, lightData, sortingCriteria);
var param = new RendererListParams(renderingData.cullResults, drawingSettings, m_FilteringSettings);
passData.rendererList = renderGraph.CreateRendererList(param);
builder.UseRendererList(passData.rendererList);
builder.AllowGlobalStateModification(true);
builder.SetRenderFunc((PassData data, RasterGraphContext rgContext) =>
{
ExecutePass(rgContext.cmd, data, data.rendererList);
});
}
}
public override void OnCameraCleanup(CommandBuffer cmd)
{
if (cmd == null)
{
throw new System.ArgumentNullException("cmd");
}
cmd.SetKeyword(ShaderGlobalKeywords.DecalNormalBlendLow, false);
cmd.SetKeyword(ShaderGlobalKeywords.DecalNormalBlendMedium, false);
cmd.SetKeyword(ShaderGlobalKeywords.DecalNormalBlendHigh, false);
cmd.SetKeyword(ShaderGlobalKeywords.DecalLayers, false);
}
}
}