Add URP render pass API parity shims

This commit is contained in:
2026-04-25 15:34:19 +08:00
parent ba4a778886
commit c0c0bbdfa3
9 changed files with 419 additions and 42 deletions

View File

@@ -12,6 +12,10 @@ namespace XCEngine.Rendering.Universal
"Universal.FinalColorFullscreen";
private const string kShaderVectorFullscreenPassName =
"Universal.ShaderVectorFullscreen";
private readonly CommandBuffer m_lifecycleCommandBuffer =
new CommandBuffer("ScriptableRenderPass");
private ScriptableRenderPassInput m_input =
ScriptableRenderPassInput.None;
protected ScriptableRenderPass()
{
@@ -20,6 +24,31 @@ namespace XCEngine.Rendering.Universal
public RenderPassEvent renderPassEvent { get; set; } =
RenderPassEvent.BeforeRenderingOpaques;
public ScriptableRenderPassInput input
{
get
{
return m_input;
}
}
public bool requiresIntermediateTexture
{
get
{
return m_input != ScriptableRenderPassInput.None;
}
}
protected ProfilingSampler profilingSampler { get; set; } =
new ProfilingSampler("Unnamed_ScriptableRenderPass");
public void ConfigureInput(
ScriptableRenderPassInput passInput)
{
m_input = passInput;
}
public virtual bool SupportsStage(
CameraFrameStage stage)
{
@@ -44,14 +73,80 @@ namespace XCEngine.Rendering.Universal
ScriptableRenderContext context,
RenderingData renderingData)
{
return RecordRenderGraph(
context,
renderingData);
RenderingData passRenderingData =
renderingData;
OnCameraSetup(
m_lifecycleCommandBuffer,
ref passRenderingData);
try
{
return RecordRenderGraph(
context,
passRenderingData);
}
finally
{
OnCameraCleanup(
m_lifecycleCommandBuffer);
}
}
protected abstract bool RecordRenderGraph(
public virtual void Execute(
ScriptableRenderContext context,
RenderingData renderingData);
ref RenderingData renderingData)
{
}
public virtual void OnCameraSetup(
CommandBuffer cmd,
ref RenderingData renderingData)
{
}
public virtual void OnCameraCleanup(
CommandBuffer cmd)
{
}
public virtual void OnFinishCameraStackRendering(
CommandBuffer cmd)
{
}
protected virtual bool RecordRenderGraph(
ScriptableRenderContext context,
RenderingData renderingData)
{
if (context == null ||
renderingData == null)
{
return false;
}
Execute(
context,
ref renderingData);
return true;
}
public static bool operator >(
ScriptableRenderPass lhs,
ScriptableRenderPass rhs)
{
return CompareRenderPassEvents(
lhs,
rhs) > 0;
}
public static bool operator <(
ScriptableRenderPass lhs,
ScriptableRenderPass rhs)
{
return CompareRenderPassEvents(
lhs,
rhs) < 0;
}
protected bool RecordColorScaleFullscreenPass(
ScriptableRenderContext context,
@@ -248,6 +343,10 @@ namespace XCEngine.Rendering.Universal
case RenderPassEvent.AfterRenderingPrePasses:
block = RendererBlock.DepthPrepass;
return true;
case RenderPassEvent.BeforeRenderingGbuffer:
case RenderPassEvent.AfterRenderingGbuffer:
case RenderPassEvent.BeforeRenderingDeferredLights:
case RenderPassEvent.AfterRenderingDeferredLights:
case RenderPassEvent.BeforeRenderingOpaques:
case RenderPassEvent.RenderOpaques:
case RenderPassEvent.AfterRenderingOpaques:
@@ -268,6 +367,7 @@ namespace XCEngine.Rendering.Universal
block = RendererBlock.PostProcess;
return true;
case RenderPassEvent.BeforeRenderingFinalOutput:
case RenderPassEvent.AfterRendering:
case RenderPassEvent.AfterRenderingFinalOutput:
block = RendererBlock.FinalOutput;
return true;
@@ -277,6 +377,31 @@ namespace XCEngine.Rendering.Universal
}
}
private static int CompareRenderPassEvents(
ScriptableRenderPass lhs,
ScriptableRenderPass rhs)
{
if (ReferenceEquals(
lhs,
rhs))
{
return 0;
}
if (lhs == null)
{
return -1;
}
if (rhs == null)
{
return 1;
}
return lhs.renderPassEvent.CompareTo(
rhs.renderPassEvent);
}
private static bool TryResolveDefaultFullscreenTargets(
ScriptableRenderContext context,
out RenderGraphTextureHandle sourceColor,