Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support Unity6 RenderGraph #150

Merged
merged 3 commits into from
Dec 10, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 50 additions & 1 deletion package/Runtime/GaussianSplatURPFeature.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
using UnityEngine.Experimental.Rendering;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
#if UNITY_6000
using UnityEngine.Rendering.RenderGraphModule;
#endif

namespace GaussianSplatting.Runtime
{
Expand All @@ -17,6 +20,7 @@ class GaussianSplatURPFeature : ScriptableRendererFeature
{
class GSRenderPass : ScriptableRenderPass
{
const string GaussianSplatRTName = "_GaussianSplatRT";
RTHandle m_RenderTarget;
internal ScriptableRenderer m_Renderer = null;
internal CommandBuffer m_Cmb = null;
Expand All @@ -32,7 +36,7 @@ public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderin
rtDesc.depthBufferBits = 0;
rtDesc.msaaSamples = 1;
rtDesc.graphicsFormat = GraphicsFormat.R16G16B16A16_SFloat;
RenderingUtils.ReAllocateIfNeeded(ref m_RenderTarget, rtDesc, FilterMode.Point, TextureWrapMode.Clamp, name: "_GaussianSplatRT");
RenderingUtils.ReAllocateIfNeeded(ref m_RenderTarget, rtDesc, FilterMode.Point, TextureWrapMode.Clamp, name: GaussianSplatRTName);
cmd.SetGlobalTexture(m_RenderTarget.name, m_RenderTarget.nameID);

ConfigureTarget(m_RenderTarget, m_Renderer.cameraDepthTargetHandle);
Expand All @@ -53,6 +57,51 @@ public override void Execute(ScriptableRenderContext context, ref RenderingData
m_Cmb.EndSample(GaussianSplatRenderSystem.s_ProfCompose);
context.ExecuteCommandBuffer(m_Cmb);
}

#if UNITY_6000
private const string ProfilerTag = "GaussianSplatRenderGraph";
private static readonly ProfilingSampler s_profilingSampler = new(ProfilerTag);
private static readonly int s_gaussianSplatRT = Shader.PropertyToID(GaussianSplatRTName);

private class PassData
{
internal UniversalCameraData CameraData;
internal TextureHandle SourceTexture;
internal TextureHandle GaussianSplatRT;
}

public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
{
using var builder = renderGraph.AddUnsafePass<PassData>(ProfilerTag, out PassData passData);

var cameraData = frameData.Get<UniversalCameraData>();
var resourceData = frameData.Get<UniversalResourceData>();

RenderTextureDescriptor rtDesc = cameraData.cameraTargetDescriptor;
rtDesc.depthBufferBits = 0;
rtDesc.msaaSamples = 1;
rtDesc.graphicsFormat = GraphicsFormat.R16G16B16A16_SFloat;
var textureHandle = UniversalRenderer.CreateRenderGraphTexture(renderGraph, rtDesc, GaussianSplatRTName, true);

passData.CameraData = cameraData;
passData.SourceTexture = resourceData.activeColorTexture;
passData.GaussianSplatRT = textureHandle;

builder.UseTexture(textureHandle, AccessFlags.Write);
builder.AllowPassCulling(false);
builder.SetRenderFunc(static (PassData data, UnsafeGraphContext context) =>
{
var commandBuffer = CommandBufferHelpers.GetNativeCommandBuffer(context.cmd);
using var _ = new ProfilingScope(commandBuffer, s_profilingSampler);
commandBuffer.SetGlobalTexture(s_gaussianSplatRT, data.GaussianSplatRT);
CoreUtils.SetRenderTarget(commandBuffer, data.GaussianSplatRT, ClearFlag.Color, Color.clear);
Material matComposite = GaussianSplatRenderSystem.instance.SortAndRenderSplats(data.CameraData.camera, commandBuffer);
commandBuffer.BeginSample(GaussianSplatRenderSystem.s_ProfCompose);
Blitter.BlitCameraTexture(commandBuffer, data.GaussianSplatRT, data.SourceTexture, matComposite, 0);
commandBuffer.EndSample(GaussianSplatRenderSystem.s_ProfCompose);
});
}
#endif
}

GSRenderPass m_Pass;
Expand Down