refactor(srp): formalize renderer block recording

This commit is contained in:
2026-04-22 01:43:54 +08:00
parent 33e9041d60
commit 99eae1fe9f
6 changed files with 411 additions and 43 deletions

View File

@@ -23,11 +23,21 @@ namespace XCEngine.Rendering.Universal
public virtual bool SupportsStage(
CameraFrameStage stage)
{
CameraFrameStage resolvedStage;
return TryResolveStage(
RendererBlock block;
return TryResolveRendererBlock(
renderPassEvent,
out resolvedStage) &&
resolvedStage == stage;
out block) &&
RendererBlockUtility.GetStage(block) == stage;
}
internal bool SupportsRendererBlock(
RendererBlock block)
{
RendererBlock resolvedBlock;
return TryResolveRendererBlock(
renderPassEvent,
out resolvedBlock) &&
resolvedBlock == block;
}
internal bool Record(
@@ -209,38 +219,60 @@ namespace XCEngine.Rendering.Universal
internal static bool TryResolveStage(
RenderPassEvent passEvent,
out CameraFrameStage stage)
{
RendererBlock block;
if (TryResolveRendererBlock(
passEvent,
out block))
{
stage =
RendererBlockUtility.GetStage(block);
return true;
}
stage = CameraFrameStage.MainScene;
return false;
}
internal static bool TryResolveRendererBlock(
RenderPassEvent passEvent,
out RendererBlock block)
{
switch (passEvent)
{
case RenderPassEvent.BeforeRenderingShadows:
case RenderPassEvent.AfterRenderingShadows:
stage = CameraFrameStage.ShadowCaster;
block = RendererBlock.ShadowCaster;
return true;
case RenderPassEvent.BeforeRenderingPrePasses:
case RenderPassEvent.AfterRenderingPrePasses:
stage = CameraFrameStage.DepthOnly;
block = RendererBlock.DepthPrepass;
return true;
case RenderPassEvent.BeforeRenderingOpaques:
case RenderPassEvent.RenderOpaques:
case RenderPassEvent.AfterRenderingOpaques:
block = RendererBlock.MainOpaque;
return true;
case RenderPassEvent.BeforeRenderingSkybox:
case RenderPassEvent.RenderSkybox:
case RenderPassEvent.AfterRenderingSkybox:
block = RendererBlock.MainSkybox;
return true;
case RenderPassEvent.BeforeRenderingTransparents:
case RenderPassEvent.RenderTransparents:
case RenderPassEvent.AfterRenderingTransparents:
stage = CameraFrameStage.MainScene;
block = RendererBlock.MainTransparent;
return true;
case RenderPassEvent.BeforeRenderingPostProcessing:
case RenderPassEvent.AfterRenderingPostProcessing:
stage = CameraFrameStage.PostProcess;
block = RendererBlock.PostProcess;
return true;
case RenderPassEvent.BeforeRenderingFinalOutput:
case RenderPassEvent.AfterRenderingFinalOutput:
stage = CameraFrameStage.FinalOutput;
block = RendererBlock.FinalOutput;
return true;
default:
stage = CameraFrameStage.MainScene;
block = RendererBlock.MainOpaque;
return false;
}
}