Skip to content

Commit ff268cf

Browse files
committed
URP: Fixes for the new Unity 6 RenderPass
- Properly composite with other 3D objects in the scene (use depth), - Properly declare inputs/outputs - Actually stop using deprecated APIs
1 parent 7a98b4b commit ff268cf

File tree

1 file changed

+50
-38
lines changed

1 file changed

+50
-38
lines changed

package/Runtime/GaussianSplatURPFeature.cs

+50-38
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
using UnityEngine.Experimental.Rendering;
66
using UnityEngine.Rendering;
77
using UnityEngine.Rendering.Universal;
8-
#if UNITY_6000
8+
#if UNITY_6000_0_OR_NEWER
99
using UnityEngine.Rendering.RenderGraphModule;
1010
#endif
1111

@@ -21,58 +21,35 @@ class GaussianSplatURPFeature : ScriptableRendererFeature
2121
class GSRenderPass : ScriptableRenderPass
2222
{
2323
const string GaussianSplatRTName = "_GaussianSplatRT";
24+
#if !UNITY_6000_0_OR_NEWER
2425
RTHandle m_RenderTarget;
25-
internal ScriptableRenderer m_Renderer = null;
26-
internal CommandBuffer m_Cmb = null;
26+
internal ScriptableRenderer m_Renderer;
27+
internal CommandBuffer m_Cmb;
28+
#endif
2729

2830
public void Dispose()
2931
{
32+
#if !UNITY_6000_0_OR_NEWER
3033
m_RenderTarget?.Release();
34+
#endif
3135
}
3236

33-
public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
34-
{
35-
RenderTextureDescriptor rtDesc = renderingData.cameraData.cameraTargetDescriptor;
36-
rtDesc.depthBufferBits = 0;
37-
rtDesc.msaaSamples = 1;
38-
rtDesc.graphicsFormat = GraphicsFormat.R16G16B16A16_SFloat;
39-
RenderingUtils.ReAllocateIfNeeded(ref m_RenderTarget, rtDesc, FilterMode.Point, TextureWrapMode.Clamp, name: GaussianSplatRTName);
40-
cmd.SetGlobalTexture(m_RenderTarget.name, m_RenderTarget.nameID);
41-
42-
ConfigureTarget(m_RenderTarget, m_Renderer.cameraDepthTargetHandle);
43-
ConfigureClear(ClearFlag.Color, new Color(0,0,0,0));
44-
}
45-
46-
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
47-
{
48-
if (m_Cmb == null)
49-
return;
50-
51-
// add sorting, view calc and drawing commands for each splat object
52-
Material matComposite = GaussianSplatRenderSystem.instance.SortAndRenderSplats(renderingData.cameraData.camera, m_Cmb);
53-
54-
// compose
55-
m_Cmb.BeginSample(GaussianSplatRenderSystem.s_ProfCompose);
56-
Blitter.BlitCameraTexture(m_Cmb, m_RenderTarget, m_Renderer.cameraColorTargetHandle, RenderBufferLoadAction.Load, RenderBufferStoreAction.Store, matComposite, 0);
57-
m_Cmb.EndSample(GaussianSplatRenderSystem.s_ProfCompose);
58-
context.ExecuteCommandBuffer(m_Cmb);
59-
}
60-
61-
#if UNITY_6000
62-
private const string ProfilerTag = "GaussianSplatRenderGraph";
63-
private static readonly ProfilingSampler s_profilingSampler = new(ProfilerTag);
64-
private static readonly int s_gaussianSplatRT = Shader.PropertyToID(GaussianSplatRTName);
37+
#if UNITY_6000_0_OR_NEWER
38+
const string ProfilerTag = "GaussianSplatRenderGraph";
39+
static readonly ProfilingSampler s_profilingSampler = new(ProfilerTag);
40+
static readonly int s_gaussianSplatRT = Shader.PropertyToID(GaussianSplatRTName);
6541

66-
private class PassData
42+
class PassData
6743
{
6844
internal UniversalCameraData CameraData;
6945
internal TextureHandle SourceTexture;
46+
internal TextureHandle SourceDepth;
7047
internal TextureHandle GaussianSplatRT;
7148
}
7249

7350
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
7451
{
75-
using var builder = renderGraph.AddUnsafePass<PassData>(ProfilerTag, out PassData passData);
52+
using var builder = renderGraph.AddUnsafePass(ProfilerTag, out PassData passData);
7653

7754
var cameraData = frameData.Get<UniversalCameraData>();
7855
var resourceData = frameData.Get<UniversalResourceData>();
@@ -85,22 +62,53 @@ public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer
8562

8663
passData.CameraData = cameraData;
8764
passData.SourceTexture = resourceData.activeColorTexture;
65+
passData.SourceDepth = resourceData.activeDepthTexture;
8866
passData.GaussianSplatRT = textureHandle;
8967

68+
builder.UseTexture(resourceData.activeColorTexture, AccessFlags.ReadWrite);
69+
builder.UseTexture(resourceData.activeDepthTexture);
9070
builder.UseTexture(textureHandle, AccessFlags.Write);
9171
builder.AllowPassCulling(false);
9272
builder.SetRenderFunc(static (PassData data, UnsafeGraphContext context) =>
9373
{
9474
var commandBuffer = CommandBufferHelpers.GetNativeCommandBuffer(context.cmd);
9575
using var _ = new ProfilingScope(commandBuffer, s_profilingSampler);
9676
commandBuffer.SetGlobalTexture(s_gaussianSplatRT, data.GaussianSplatRT);
97-
CoreUtils.SetRenderTarget(commandBuffer, data.GaussianSplatRT, ClearFlag.Color, Color.clear);
77+
CoreUtils.SetRenderTarget(commandBuffer, data.GaussianSplatRT, data.SourceDepth, ClearFlag.Color, Color.clear);
9878
Material matComposite = GaussianSplatRenderSystem.instance.SortAndRenderSplats(data.CameraData.camera, commandBuffer);
9979
commandBuffer.BeginSample(GaussianSplatRenderSystem.s_ProfCompose);
10080
Blitter.BlitCameraTexture(commandBuffer, data.GaussianSplatRT, data.SourceTexture, matComposite, 0);
10181
commandBuffer.EndSample(GaussianSplatRenderSystem.s_ProfCompose);
10282
});
10383
}
84+
#else
85+
public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
86+
{
87+
RenderTextureDescriptor rtDesc = renderingData.cameraData.cameraTargetDescriptor;
88+
rtDesc.depthBufferBits = 0;
89+
rtDesc.msaaSamples = 1;
90+
rtDesc.graphicsFormat = GraphicsFormat.R16G16B16A16_SFloat;
91+
RenderingUtils.ReAllocateIfNeeded(ref m_RenderTarget, rtDesc, FilterMode.Point, TextureWrapMode.Clamp, name: GaussianSplatRTName);
92+
cmd.SetGlobalTexture(m_RenderTarget.name, m_RenderTarget.nameID);
93+
94+
ConfigureTarget(m_RenderTarget, m_Renderer.cameraDepthTargetHandle);
95+
ConfigureClear(ClearFlag.Color, new Color(0,0,0,0));
96+
}
97+
98+
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
99+
{
100+
if (m_Cmb == null)
101+
return;
102+
103+
// add sorting, view calc and drawing commands for each splat object
104+
Material matComposite = GaussianSplatRenderSystem.instance.SortAndRenderSplats(renderingData.cameraData.camera, m_Cmb);
105+
106+
// compose
107+
m_Cmb.BeginSample(GaussianSplatRenderSystem.s_ProfCompose);
108+
Blitter.BlitCameraTexture(m_Cmb, m_RenderTarget, m_Renderer.cameraColorTargetHandle, RenderBufferLoadAction.Load, RenderBufferStoreAction.Store, matComposite, 0);
109+
m_Cmb.EndSample(GaussianSplatRenderSystem.s_ProfCompose);
110+
context.ExecuteCommandBuffer(m_Cmb);
111+
}
104112
#endif
105113
}
106114

@@ -122,16 +130,20 @@ public override void OnCameraPreCull(ScriptableRenderer renderer, in CameraData
122130
if (!system.GatherSplatsForCamera(cameraData.camera))
123131
return;
124132

133+
#if !UNITY_6000_0_OR_NEWER
125134
CommandBuffer cmb = system.InitialClearCmdBuffer(cameraData.camera);
126135
m_Pass.m_Cmb = cmb;
136+
#endif
127137
m_HasCamera = true;
128138
}
129139

130140
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
131141
{
132142
if (!m_HasCamera)
133143
return;
144+
#if !UNITY_6000_0_OR_NEWER
134145
m_Pass.m_Renderer = renderer;
146+
#endif
135147
renderer.EnqueuePass(m_Pass);
136148
}
137149

0 commit comments

Comments
 (0)